From 56d9cc685bbf53acc13eeb3be9cb77caf8ca6038 Mon Sep 17 00:00:00 2001 From: Medicina Operator Date: Wed, 22 Mar 2017 12:55:58 +0000 Subject: [PATCH] escs-0.5 Common --- .../include/AntennaBossTextClient.h | 110 + .../include/UpdateGenerator.i | 254 + .../src/AntennaBossTextClient.cpp | 644 + .../AntennaBossTextClient/src/Makefile | 114 + .../AntennaBossTextClient/src/antennaBossTui | 13 + .../template/scanExample.scd | 12 + Common/Clients/CaltoolClient/src/Makefile | 214 + .../src/calibrationToolClient.ui | 711 ++ .../src/calibrationtoolclient.py | 330 + .../CaltoolClient/src/customwidgets.py | 80 + .../Clients/CustomLoggingClient/src/Makefile | 207 + .../src/_gui_customLoggingClient.py | 103 + .../CustomLoggingClient/src/loggingDisplay | 2 + .../include/BackendClient.h | 98 + .../src/BackendClient.cpp | 541 + .../GenericBackendTextClient/src/Makefile | 114 + .../src/genericBackendTui | 12 + Common/Clients/Makefile | 166 + .../include/MinorServoBossTextClient.h | 106 + .../MinorServoBossTextClient/src/Makefile | 115 + .../src/MinorServoBossTextClient.cpp | 414 + .../src/minorservoBossTui | 1 + .../include/ObservatoryTextClient.h | 86 + .../ObservatoryTextClient/src/Makefile | 116 + .../src/ObservatoryTextClient.cpp | 440 + .../ObservatoryTextClient/src/observatoryTui | 13 + .../include/ReceiversBossTextClient.h | 108 + .../ReceiversBossTextClient/src/Makefile | 114 + .../src/ReceiversBossTextClient.cpp | 577 + .../src/receiversBossTui | 11 + .../ReceiversBossTextClient/src/updateDewar.i | 100 + .../include/SchedulerTuiClient.h | 96 + .../Clients/SchedulerTextClient/src/Makefile | 235 + .../src/SchedulerTuiClient.cpp | 444 + .../SchedulerTextClient/src/schedulerTui | 11 + Common/Clients/SystemTerminal/src/Makefile | 75 + .../SystemTerminal/src/_tui_SysTerm.py | 183 + .../SystemTerminal/src/nuraghe_commands.py | 673 + .../Clients/SystemTerminal/src/operatorInput | 11 + Common/Clients/XBackendClient/.cproject | 718 ++ Common/Clients/XBackendClient/.project | 82 + Common/Clients/XBackendClient/include/Data.h | 150 + .../XBackendClient/include/DataIntegrazione.h | 258 + Common/Clients/XBackendClient/include/Led.h | 81 + .../XBackendClient/include/Specifiche.h | 136 + .../XBackendClient/include/XBackendsClient.h | 109 + .../XBackendClient/include/XControlSystem.h | 57 + .../XBackendClient/include/headResult.h | 134 + Common/Clients/XBackendClient/include/plot.h | 47 + .../XBackendClient/include/xclientGUI.h | 526 + .../XBackendClient/include/xclientGUIui.h | 103 + Common/Clients/XBackendClient/include/xplot.h | 159 + .../Clients/XBackendClient/include/xplotGUI.h | 213 + .../XBackendClient/src/.idl-compilation-end | 0 .../XBackendClient/src/.idl-compilation-start | 0 Common/Clients/XBackendClient/src/Data.cpp | 24 + .../XBackendClient/src/DataIntegrazione.cpp | 121 + Common/Clients/XBackendClient/src/Led.cpp | 69 + Common/Clients/XBackendClient/src/Makefile | 349 + .../Clients/XBackendClient/src/Specifiche.cpp | 50 + .../XBackendClient/src/XBackendsClient.cpp | 394 + .../XBackendClient/src/XControlSystem.cpp | 136 + .../Clients/XBackendClient/src/headResult.cpp | 45 + .../XBackendClient/src/moc_XControlSystem.cpp | 78 + .../Clients/XBackendClient/src/moc_plot.cpp | 75 + .../XBackendClient/src/moc_xclientGUIui.cpp | 117 + .../Clients/XBackendClient/src/moc_xplot.cpp | 92 + Common/Clients/XBackendClient/src/plot.cpp | 138 + .../Clients/XBackendClient/src/xclientGUI.ui | 537 + .../XBackendClient/src/xclientGUIui.cpp | 609 + Common/Clients/XBackendClient/src/xplot.cpp | 252 + Common/Clients/XBackendClient/src/xplotGUI.ui | 235 + Common/Clients/dummy.txt | 1 + Common/Documentation/dummy.txt | 1 + .../AntennaErrors/idl/AntennaErrors.xml | 62 + Common/Errors/AntennaErrors/src/Makefile | 90 + .../BackendsErrors/idl/BackendsErrors.xml | 38 + Common/Errors/BackendsErrors/src/Makefile | 90 + Common/Errors/ClientErrors/ChangeLog | 1 + .../Errors/ClientErrors/idl/ClientErrors.xml | 44 + Common/Errors/ClientErrors/src/Makefile | 97 + Common/Errors/ComponentErrors/idl/.cvsignore | 1 + .../ComponentErrors/idl/ComponentErrors.xml | 109 + Common/Errors/ComponentErrors/src/Makefile | 87 + Common/Errors/Makefile | 162 + .../ManagementErrors/idl/ManagementErrors.xml | 111 + Common/Errors/ManagementErrors/src/Makefile | 81 + .../idl/ACSErrTypeFPGACommunication.xml | 23 + .../idl/ACSErrTypeFPGAConnection.xml | 19 + Common/Errors/MetrologyErrors/src/Makefile | 91 + .../MinorServoErrors/idl/MinorServoErrors.xml | 63 + Common/Errors/MinorServoErrors/src/Makefile | 80 + .../Errors/ParserErrors/idl/ParserErrors.xml | 56 + Common/Errors/ParserErrors/src/Makefile | 79 + .../ReceiversErrors/idl/DerotatorErrors.xml | 42 + .../ReceiversErrors/idl/ReceiversErrors.xml | 59 + Common/Errors/ReceiversErrors/src/Makefile | 73 + Common/Errors/XBackendErrors/.cproject | 714 ++ Common/Errors/XBackendErrors/.project | 81 + .../XBackendErrors/idl/XBackendsErrors.xml | 24 + .../XBackendErrors/src/.idl-compilation-end | 0 .../XBackendErrors/src/.idl-compilation-start | 0 Common/Errors/XBackendErrors/src/Makefile | 90 + Common/Errors/dummy.txt | 1 + Common/Errors/errortypes.txt | 10 + .../config/CDB/schemas/ActiveSurface.xsd | 34 + .../idl/ActiveSurfaceBoss.idl | 44 + .../ActiveSurfaceInterface/src/Makefile | 207 + .../config/CDB/schemas/Mount.xsd | 55 + .../config/CDB/schemas/PointingModel.xsd | 89 + .../config/CDB/schemas/Station.xsd | 41 + .../AntennaInterface/config/doxyfile | 2 + .../AntennaInterface/idl/AntennaBoss.midl | 671 + .../AntennaInterface/idl/EphemGenerator.idl | 152 + .../idl/EphemGeneratorMACRO_include.idl | 45 + .../Interfaces/AntennaInterface/idl/Moon.midl | 57 + .../AntennaInterface/idl/Mount.midl | 302 + .../Interfaces/AntennaInterface/idl/OTF.midl | 117 + .../AntennaInterface/idl/Observatory.midl | 178 + .../AntennaInterface/idl/PointingModel.idl | 54 + .../AntennaInterface/idl/Refraction.idl | 49 + .../AntennaInterface/idl/SkySource.midl | 124 + .../AntennaInterface/images/Antenna.png | Bin 0 -> 406112 bytes .../AntennaInterface/src/Antenna.xmi | 10409 ++++++++++++++++ .../Interfaces/AntennaInterface/src/Makefile | 79 + .../config/CDB/schemas/DigitalXCorrelator.xsd | 33 + .../config/CDB/schemas/GenericBackend.xsd | 29 + .../config/CDB/schemas/Holography.xsd | 107 + .../BackendsInterface/config/doxyfile | 2 + .../BackendsInterface/idl/BackendsBoss.idl | 33 + .../Interfaces/BackendsInterface/idl/DBBC.idl | 17 + .../BackendsInterface/idl/DFBInterface.idl | 51 + .../idl/DigitalXCorrelator.idl | 71 + .../BackendsInterface/idl/GenericBackend.idl | 357 + .../BackendsInterface/idl/Holography.idl | 60 + .../BackendsInterface/idl/NoiseGenerator.idl | 30 + .../BackendsInterface/idl/Roach.idl | 138 + .../BackendsInterface/idl/TotalPower.idl | 159 + .../BackendsInterface/images/Backends.png | Bin 0 -> 100993 bytes .../Interfaces/BackendsInterface/src/Makefile | 82 + .../config/CDB/schemas/Antenna.xsd | 137 + .../config/CDB/schemas/Managment.xsd | 189 + .../config/CDB/schemas/Receivers.xsd | 50 + .../CommonInterface/config/doxyfile | 2 + .../idl/AntennaDefinitions.midl | 246 + .../idl/BackendsDefinitions.midl | 96 + .../idl/ManagmentDefinitions.midl | 197 + .../idl/MinorServoDefinitions.midl | 66 + .../idl/ReceiversDefinitions.midl | 82 + .../CommonInterface/include/AntennaModule.h | 151 + .../include/ManagementModule.h | 130 + .../CommonInterface/include/ReceiversModule.h | 143 + .../Interfaces/CommonInterface/src/Makefile | 165 + .../CommonInterface/src/ManagementModule.cpp | 33 + .../CommonInterface/src/ReceiversModule.cpp | 76 + Common/Interfaces/Makefile | 162 + .../config/CDB/schemas/ProcedureFile.xsd | 33 + .../config/CDB/schemas/TelescopeEquipment.xsd | 63 + .../ManagmentInterface/config/doxyfile | 2 + .../idl/CalibrationTool.idl | 62 + .../ManagmentInterface/idl/CustomLogger.midl | 113 + .../ManagmentInterface/idl/DataReceiver.idl | 187 + .../idl/ExternalClients.idl | 43 + .../ManagmentInterface/idl/FitsWriter.idl | 69 + .../ManagmentInterface/idl/MBFitsWriter.idl | 62 + .../ManagmentInterface/idl/Scheduler.idl | 410 + .../ManagmentInterface/src/Makefile | 77 + .../MinorServoInterface/idl/MinorServo.idl | 731 ++ .../idl/MinorServoBoss.idl | 284 + .../MinorServoInterface/src/Makefile | 62 + .../MinorServoInterface/test/Makefile | 95 + .../test/PyMinorServoTest/__init__.py | 0 .../test/PyMinorServoTest/simunittest.py | 24 + .../test/external/__init__.py | 0 .../test/functional/__init__.py | 0 .../test/functional/commands/__init__.py | 0 .../functional/commands/test_servoSetup.py | 62 + .../commands/test_setServoASConfiguration.py | 44 + .../test_setServoElevationTracking.py | 46 + .../commands/test_setServoOffset.py | 38 + .../test/functional/test_clearUserOffset.py | 42 + .../test/functional/test_getAxesInfo.py | 73 + .../test/functional/test_getAxesPosition.py | 70 + .../functional/test_getCentralScanPosition.py | 35 + .../test/functional/test_position.py | 108 + .../test/functional/test_scan.py | 407 + .../functional/test_setASConfiguration.py | 40 + .../functional/test_setElevationTracking.py | 40 + .../test/functional/test_systemOffset.py | 78 + .../test/functional/test_userOffset.py | 79 + .../test/pyunit/__init__.py | 0 .../MinorServoInterface/test/unittest.cpp | 6 + .../CDB/schemas/DewarPositionerActions.xsd | 29 + .../CDB/schemas/DewarPositionerMapping.xsd | 28 + .../schemas/DewarPositionerUpdatingTable.xsd | 37 + .../config/CDB/schemas/Feeds.xsd | 38 + .../config/CDB/schemas/LocalOscillator.xsd | 26 + .../CDB/schemas/LocalOscillatorEthernet.xsd | 23 + .../schemas/LocalOscillatorLookUpTable.xsd | 36 + .../CDB/schemas/NoiseMarkLookUpTable.xsd | 64 + .../config/CDB/schemas/ReceiversModeSetup.xsd | 49 + .../config/CDB/schemas/TaperLookUpTable.xsd | 36 + .../ReceiversInterface/config/doxyfile | 2 + .../idl/CommonReceiverInterface.idl | 195 + .../idl/DewarPositioner.idl | 322 + .../idl/DewarPositionerDefinitions.midl | 52 + .../idl/GenericDerotator.idl | 252 + .../idl/GenericReceiver.idl | 112 + .../idl/LocalOscillatorInterface.idl | 78 + .../ReceiversInterface/idl/ReceiversBoss.idl | 243 + .../ReceiversInterface/src/Makefile | 57 + .../idl/GenericWeatherStation.idl | 102 + .../WeatherStationInterface/idl/MeteoData.idl | 98 + .../WeatherStationInterface/src/Makefile | 137 + Common/Interfaces/XBackendInterface/.cproject | 253 + Common/Interfaces/XBackendInterface/.project | 82 + .../XBackendInterface/idl/XBackends.midl | 50 + .../Interfaces/XBackendInterface/src/Makefile | 78 + Common/Interfaces/dummy.txt | 1 + .../include/ActiveSurfaceProxy.h | 13 + .../ComponentProxy/include/AntennaProxy.h | 13 + .../ComponentProxy/include/BackendsProxy.h | 21 + .../ComponentProxy/include/ComponentProxies | 13 + .../ComponentProxy/include/ComponentProxy.h | 242 + .../ComponentProxy/include/ManagementProxy.h | 22 + .../ComponentProxy/include/MinorServoProxy.h | 15 + .../ComponentProxy/include/MountProxy.h | 13 + .../ComponentProxy/include/ReceiversProxy.h | 18 + .../ComponentProxy/include/WeatherProxy.h | 14 + Common/Libraries/ComponentProxy/src/Makefile | 103 + .../ComponentProxy/src/compilation_test.cpp | 36 + .../include/DiscosBackendProtocol | 7 + .../DiscosBackendProtocol/include/command.hpp | 33 + .../include/protocol.hpp | 88 + .../DiscosBackendProtocol/src/Makefile | 82 + .../DiscosBackendProtocol/src/command.cpp | 71 + .../DiscosBackendProtocol/src/protocol.cpp | 127 + .../DiscosBackendProtocol/tests/.discos | 5 + .../DiscosBackendProtocol/tests/Makefile | 90 + .../tests/external/__init__.py | 0 .../tests/functional/__init__.py | 0 .../tests/pyunit/__init__.py | 0 .../DiscosBackendProtocol/tests/unittest.cpp | 20 + .../doc/receiver_lib/receiver_library.pdf | Bin 0 -> 638352 bytes .../IRALibrary/include/CustomLoggerUtils.h | 89 + Common/Libraries/IRALibrary/include/DBTable.h | 206 + .../Libraries/IRALibrary/include/DataField.h | 145 + .../Libraries/IRALibrary/include/DateTime.h | 444 + .../IRALibrary/include/Definitions.h | 268 + Common/Libraries/IRALibrary/include/Error.h | 186 + .../Libraries/IRALibrary/include/FastQueue.h | 102 + .../IRALibrary/include/FrequencyTracking.h | 225 + Common/Libraries/IRALibrary/include/IRA | 21 + .../Libraries/IRALibrary/include/IRATools.h | 786 ++ Common/Libraries/IRALibrary/include/Lecom.h | 326 + Common/Libraries/IRALibrary/include/LogDike.h | 402 + .../Libraries/IRALibrary/include/LogFilter.h | 581 + .../IRALibrary/include/MicroControllerBoard.h | 153 + .../include/MicroControllerBoardDef.h | 281 + .../IRALibrary/include/ReceiverControl.h | 1018 ++ .../IRALibrary/include/ScheduleTimer.h | 172 + .../Libraries/IRALibrary/include/SecureArea.h | 244 + .../Libraries/IRALibrary/include/SerialPort.h | 183 + Common/Libraries/IRALibrary/include/Site.h | 259 + .../Libraries/IRALibrary/include/SkySource.h | 387 + Common/Libraries/IRALibrary/include/Socket.h | 529 + .../Libraries/IRALibrary/include/SourceFlux.h | 80 + Common/Libraries/IRALibrary/include/String.h | 483 + .../include/TimeTaggedCircularArray.h | 169 + .../IRALibrary/include/TimeoutSync.h | 61 + Common/Libraries/IRALibrary/include/Timer.h | 29 + .../IRALibrary/src/CustomLoggerUtils.cpp | 103 + Common/Libraries/IRALibrary/src/DBTable.cpp | 239 + Common/Libraries/IRALibrary/src/DataField.cpp | 150 + Common/Libraries/IRALibrary/src/DateTime.cpp | 359 + Common/Libraries/IRALibrary/src/Error.cpp | 168 + .../IRALibrary/src/FrequencyTracking.cpp | 371 + .../IRALibrary/src/IRAPy/__init__.py | 14 + .../Libraries/IRALibrary/src/IRAPy/bsqueue.py | 93 + .../IRALibrary/src/IRAPy/customlogging.py | 54 + Common/Libraries/IRALibrary/src/IRATools.cpp | 1296 ++ Common/Libraries/IRALibrary/src/Lecom.cpp | 512 + Common/Libraries/IRALibrary/src/LogDike.cpp | 236 + Common/Libraries/IRALibrary/src/LogFilter.cpp | 342 + Common/Libraries/IRALibrary/src/Makefile | 158 + .../IRALibrary/src/MicroControllerBoard.cpp | 294 + .../IRALibrary/src/ReceiverControl.cpp | 1854 +++ .../IRALibrary/src/ScheduleTimer.cpp | 196 + .../Libraries/IRALibrary/src/SerialPort.cpp | 259 + Common/Libraries/IRALibrary/src/Site.cpp | 217 + Common/Libraries/IRALibrary/src/SkySource.cpp | 456 + Common/Libraries/IRALibrary/src/Socket.cpp | 874 ++ .../Libraries/IRALibrary/src/SourceFlux.cpp | 134 + Common/Libraries/IRALibrary/src/String.cpp | 781 ++ .../Libraries/IRALibrary/src/TestDBTable.cpp | 99 + Common/Libraries/IRALibrary/src/TestDike.cpp | 113 + .../IRALibrary/src/TestFloatRounding.cpp | 46 + .../IRALibrary/src/TestFrequency.cpp | 267 + .../src/TestMicroControllerBoard.cpp | 389 + .../IRALibrary/src/TestReceiverControl.cpp | 536 + .../IRALibrary/src/TestScheduleTimer.cpp | 88 + .../IRALibrary/src/TestSiderealToUTC.cpp | 73 + .../IRALibrary/src/TestSkySource.cpp | 222 + .../IRALibrary/src/TestSourceFlux.cpp | 99 + .../Libraries/IRALibrary/src/TestTTCArray.cpp | 57 + Common/Libraries/IRALibrary/src/TestTimer.cpp | 26 + .../IRALibrary/src/TestTypeConversion.cpp | 90 + .../src/TimeTaggedCircularArray.cpp | 247 + .../Libraries/IRALibrary/src/TimeoutSync.cpp | 53 + Common/Libraries/IRALibrary/src/Timer.cpp | 21 + Common/Libraries/IRALibrary/tests/.discos | 5 + .../IRALibrary/tests/FastQueue_test.i | 68 + .../IRALibrary/tests/IRATools_test.i | 407 + Common/Libraries/IRALibrary/tests/Makefile | 90 + .../IRALibrary/tests/external/__init__.py | 0 .../IRALibrary/tests/functional/__init__.py | 0 .../IRALibrary/tests/pyunit/__init__.py | 0 .../Libraries/IRALibrary/tests/unittest.cpp | 63 + Common/Libraries/Makefile | 162 + .../ModbusChannel/include/ModbusChannel.h | 116 + Common/Libraries/ModbusChannel/src/Makefile | 208 + .../ModbusChannel/src/ModbusChannel.cpp | 113 + .../ParserLibrary/include/SP_function0.h | 74 + .../ParserLibrary/include/SP_function1.h | 117 + .../ParserLibrary/include/SP_function2.h | 143 + .../ParserLibrary/include/SP_function3.h | 170 + .../ParserLibrary/include/SP_function4.h | 198 + .../ParserLibrary/include/SP_function5.h | 225 + .../ParserLibrary/include/SP_function6.h | 250 + .../ParserLibrary/include/SP_function7.h | 278 + .../ParserLibrary/include/SP_functor.h | 137 + .../ParserLibrary/include/SP_parser.h | 618 + .../ParserLibrary/include/SP_parser.i | 545 + .../ParserLibrary/include/SP_typeConversion.h | 563 + .../ParserLibrary/include/SP_types.h | 388 + Common/Libraries/ParserLibrary/src/Makefile | 100 + .../ParserLibrary/src/TestFunctions.cpp | 280 + .../ParserLibrary/src/TestParser.cpp | 253 + .../Libraries/ParserLibrary/src/TestTypes.cpp | 156 + Common/Libraries/ParserLibrary/tests/.discos | 0 Common/Libraries/ParserLibrary/tests/Makefile | 90 + .../ParserLibrary/tests/external/__init__.py | 0 .../tests/functional/__init__.py | 0 .../ParserLibrary/tests/gtest/procedures.cpp | 184 + .../ParserLibrary/tests/procedure.cfg | 11 + .../ParserLibrary/tests/pyunit/__init__.py | 0 .../tests/results/cppunittest.xml | 13 + .../ParserLibrary/tests/unittest.cpp | 2 + .../Libraries/QtGraphicsLibrary/IRA_box.cpp | 995 ++ Common/Libraries/QtGraphicsLibrary/IRA_box.h | 186 + .../QtGraphicsLibrary/IRA_boxscope.cpp | 73 + .../QtGraphicsLibrary/IRA_boxscope.h | 56 + .../Libraries/QtGraphicsLibrary/IRA_curve.cpp | 157 + .../Libraries/QtGraphicsLibrary/IRA_curve.h | 70 + .../QtGraphicsLibrary/IRA_datapoint.cpp | 234 + .../QtGraphicsLibrary/IRA_datapoint.h | 72 + .../QtGraphicsLibrary/IRA_graphics.pro | 38 + .../IRA_graphics.pro.README.txt | 44 + .../QtGraphicsLibrary/IRA_histogram.cpp | 149 + .../QtGraphicsLibrary/IRA_histogram.h | 60 + .../Libraries/QtGraphicsLibrary/IRA_image.cpp | 574 + .../Libraries/QtGraphicsLibrary/IRA_image.h | 117 + .../Libraries/QtGraphicsLibrary/IRA_label.cpp | 92 + .../Libraries/QtGraphicsLibrary/IRA_label.h | 64 + .../QtGraphicsLibrary/IRA_monitor.cpp | 46 + .../Libraries/QtGraphicsLibrary/IRA_monitor.h | 60 + .../QtGraphicsLibrary/IRA_plotter.cpp | 351 + .../Libraries/QtGraphicsLibrary/IRA_plotter.h | 112 + Common/Libraries/QtGraphicsLibrary/Makefile | 265 + .../TextWindowLibrary/include/TW_Callbacks.h | 291 + .../TextWindowLibrary/include/TW_Callbacks.i | 75 + .../TextWindowLibrary/include/TW_Frame.h | 253 + .../include/TW_FrameComponent.h | 316 + .../include/TW_InputCommand.h | 142 + .../TextWindowLibrary/include/TW_Label.h | 89 + .../TextWindowLibrary/include/TW_LedDisplay.h | 118 + .../include/TW_PropertyBitField.h | 112 + .../include/TW_PropertyBitField.i | 107 + .../include/TW_PropertyComponent.h | 189 + .../include/TW_PropertyComponent.i | 118 + .../include/TW_PropertyLedDisplay.h | 118 + .../include/TW_PropertyLedDisplay.i | 93 + .../include/TW_PropertyStatusBox.h | 161 + .../include/TW_PropertyStatusBox.i | 147 + .../include/TW_PropertyText.h | 79 + .../include/TW_PropertyText.i | 51 + .../TextWindowLibrary/include/TW_StatusBox.h | 131 + .../TextWindowLibrary/include/TW_StatusBox.i | 122 + .../TextWindowLibrary/include/TW_Text.h | 69 + .../TextWindowLibrary/include/TW_Tools.h | 335 + .../TextWindowLibrary/src/Callbacks.cpp | 226 + .../Libraries/TextWindowLibrary/src/Frame.cpp | 249 + .../TextWindowLibrary/src/FrameComponent.cpp | 148 + .../TextWindowLibrary/src/InputCommand.cpp | 325 + .../Libraries/TextWindowLibrary/src/Label.cpp | 52 + .../TextWindowLibrary/src/LedDisplay.cpp | 92 + .../Libraries/TextWindowLibrary/src/Makefile | 214 + .../src/PropertyBitField.cpp | 3 + .../src/PropertyComponent.cpp | 3 + .../src/PropertyLedDisplay.cpp | 3 + .../src/PropertyStatusBox.cpp | 3 + .../TextWindowLibrary/src/PropertyText.cpp | 3 + .../TextWindowLibrary/src/StatusBox.cpp | 3 + .../Libraries/TextWindowLibrary/src/Text.cpp | 51 + .../Libraries/TextWindowLibrary/src/Tools.cpp | 229 + .../src/getTextClientTemplate | 93 + .../templates/Client.cpp.template | 350 + .../templates/Client.h.template | 101 + Common/Libraries/XarcosLibrary/.cproject | 261 + Common/Libraries/XarcosLibrary/.project | 84 + .../org.eclipse.core.resources.prefs | 3 + .../XarcosLibrary/include/AdcConditioner.h | 177 + .../XarcosLibrary/include/BbcFilter.h | 78 + .../XarcosLibrary/include/Configuration.h | 126 + .../XarcosLibrary/include/Cpld2Intf.h | 65 + .../XarcosLibrary/include/Cpld2IntfClient.h | 87 + Common/Libraries/XarcosLibrary/include/Data.h | 149 + .../XarcosLibrary/include/DataIntegrazione.h | 257 + .../XarcosLibrary/include/GroupSpectrometer.h | 180 + .../XarcosLibrary/include/HardwareBlock.h | 71 + .../include/SingleSpectrometer.h | 214 + .../XarcosLibrary/include/SocketClient.h | 55 + .../XarcosLibrary/include/SocketConnection.h | 112 + .../XarcosLibrary/include/SocketServer.h | 68 + .../XarcosLibrary/include/Specifiche.h | 134 + .../XarcosLibrary/include/Spectrometer.h | 130 + .../Libraries/XarcosLibrary/include/XaMutex.h | 98 + .../XarcosLibrary/include/XaSemaphore.h | 66 + .../XarcosLibrary/include/XaThread.h | 159 + .../XarcosLibrary/include/headResult.h | 132 + .../XarcosLibrary/src/AdcConditioner.cpp | 185 + .../Libraries/XarcosLibrary/src/BbcFilter.cpp | 203 + .../Libraries/XarcosLibrary/src/Cpld2Intf.cpp | 73 + .../XarcosLibrary/src/Cpld2IntfClient.cpp | 147 + Common/Libraries/XarcosLibrary/src/Data.cpp | 31 + .../XarcosLibrary/src/DataIntegrazione.cpp | 140 + .../XarcosLibrary/src/GroupSpectrometer.cpp | 817 ++ .../XarcosLibrary/src/HardwareBlock.cpp | 41 + Common/Libraries/XarcosLibrary/src/Makefile | 213 + .../XarcosLibrary/src/SingleSpectrometer.cpp | 349 + .../XarcosLibrary/src/SocketClient.cpp | 47 + .../XarcosLibrary/src/SocketConnection.cpp | 176 + .../XarcosLibrary/src/SocketServer.cpp | 80 + .../XarcosLibrary/src/Specifiche.cpp | 53 + .../XarcosLibrary/src/Spectrometer.cpp | 230 + .../Libraries/XarcosLibrary/src/XaMutex.cpp | 90 + .../XarcosLibrary/src/XaSemaphore.cpp | 94 + .../Libraries/XarcosLibrary/src/XaThread.cpp | 49 + .../XarcosLibrary/src/headResult.cpp | 46 + Common/Libraries/dummy.txt | 1 + Common/Misc/InjectCommand/src/Makefile | 207 + .../Misc/InjectCommand/src/injectCommand.py | 55 + .../Misc/KStars/app-defaults/Calibrators.ksc | 12 + Common/Misc/KStars/app-defaults/Kband.ksc | 1720 +++ Common/Misc/KStars/doc/README.txt | 7 + Common/Misc/KStars/doc/kstars-patch.html | 97 + Common/Misc/KStars/src/Makefile | 75 + Common/Misc/KStars/src/startKS.py | 83 + Common/Misc/Makefile | 162 + Common/Misc/OnOffSwitching/config.py | 106 + Common/Misc/OnOffSwitching/devices.py | 135 + Common/Misc/OnOffSwitching/handler.py | 458 + .../Misc/OnOffSwitching/horizons/example.txt | 1630 +++ Common/Misc/OnOffSwitching/models.py | 67 + Common/Misc/OnOffSwitching/onoff_switching.py | 72 + Common/Misc/OnOffSwitching/test_config.py | 29 + .../OnOffSwitching/utils/test_tracking.py | 34 + Common/Misc/Plotter/src/Makefile | 74 + Common/Misc/Plotter/src/install.txt | 4 + Common/Misc/Plotter/src/plotter.py | 420 + Common/Misc/RScanSched/include/RScanSched.h | 21 + Common/Misc/RScanSched/src/Makefile | 207 + Common/Misc/RScanSched/src/RScanSched.cpp | 280 + Common/Misc/Scripts/src/Makefile | 86 + Common/Misc/Scripts/src/data_stats | 130 + Common/Misc/Scripts/src/tabbify | 91 + Common/Misc/getTemplateForTests/src/Makefile | 59 + .../src/getTemplateForTests | 29 + .../src/gettemplatefortests.py | 50 + .../templates/tests/.discos | 5 + .../templates/tests/Makefile | 90 + .../templates/tests/external/__init__.py | 0 .../templates/tests/functional/__init__.py | 0 .../templates/tests/pyunit/__init__.py | 0 .../templates/tests/unittest.cpp | 6 + .../Misc/getTemplateForTests/tests/Makefile | 90 + .../tests/external/__init__.py | 0 .../tests/functional/__init__.py | 0 .../tests/functional/test_no_svn.py | 28 + .../tests/pyunit/__init__.py | 0 .../getTemplateForTests/tests/unittest.cpp | 6 + .../config/CDB/schemas/AntennaBoss.xsd | 98 + .../AntennaBoss/include/AntennaBossImpl.h | 684 + Common/Servers/AntennaBoss/include/BossCore.h | 1073 ++ Common/Servers/AntennaBoss/include/Callback.h | 39 + .../AntennaBoss/include/Configuration.h | 225 + .../include/DevIOCorrectionOffsets.h | 72 + .../Servers/AntennaBoss/include/DevIOEnable.h | 76 + .../AntennaBoss/include/DevIOGeneratorType.h | 55 + .../Servers/AntennaBoss/include/DevIOHPBW.h | 57 + .../Servers/AntennaBoss/include/DevIOLambda.h | 56 + .../include/DevIOObservedEquatorial.h | 69 + .../include/DevIOObservedGalactic.h | 70 + .../include/DevIOObservedHorizontal.h | 69 + .../AntennaBoss/include/DevIOOffsets.h | 94 + .../AntennaBoss/include/DevIORawHorizontal.h | 75 + .../Servers/AntennaBoss/include/DevIOStatus.h | 57 + .../include/DevIOTargetCoordinate.h | 77 + .../AntennaBoss/include/DevIOTargetName.h | 55 + .../AntennaBoss/include/DevIOVradDefinition.h | 52 + .../include/DevIOVradReferenceFrame.h | 53 + Common/Servers/AntennaBoss/include/Offset.h | 76 + .../Servers/AntennaBoss/include/SlewCheck.h | 103 + .../Servers/AntennaBoss/include/TestClient.h | 17 + .../AntennaBoss/include/WatchingThread.h | 58 + .../AntennaBoss/include/WorkingThread.h | 63 + .../AntennaBoss/src/AntennaBossImpl.cpp | 665 + Common/Servers/AntennaBoss/src/BossCore.cpp | 1871 +++ .../Servers/AntennaBoss/src/BossCore_extra.i | 129 + .../AntennaBoss/src/BossCore_prepareScan.i | 538 + .../AntennaBoss/src/BossCore_startScan.i | 148 + .../src/BossCore_startScanWrappers.i | 51 + Common/Servers/AntennaBoss/src/Callback.cpp | 40 + .../Servers/AntennaBoss/src/Configuration.cpp | 117 + Common/Servers/AntennaBoss/src/Makefile | 116 + Common/Servers/AntennaBoss/src/Offset.cpp | 149 + Common/Servers/AntennaBoss/src/SlewCheck.cpp | 111 + Common/Servers/AntennaBoss/src/TestClient.cpp | 205 + .../AntennaBoss/src/WatchingThread.cpp | 58 + .../Servers/AntennaBoss/src/WorkingThread.cpp | 81 + .../AntennaBoss/src/coordinateGrabber.cpp | 236 + Common/Servers/AntennaBoss/tests/.discos | 5 + Common/Servers/AntennaBoss/tests/Makefile | 90 + .../Servers/AntennaBoss/tests/Offset_test.i | 172 + .../AntennaBoss/tests/external/__init__.py | 0 .../AntennaBoss/tests/functional/__init__.py | 0 .../AntennaBoss/tests/pyunit/__init__.py | 0 Common/Servers/AntennaBoss/tests/unittest.cpp | 23 + .../config/CDB/schemas/CalibrationTool.xsd | 74 + .../include/CalibrationToolImpl.h | 247 + .../CalibrationTool/include/CollectorThread.h | 84 + .../CalibrationTool/include/CommonTools.h | 99 + .../CalibrationTool/include/Configuration.h | 124 + .../CalibrationTool/include/DataCollection.h | 663 + .../CalibrationTool/include/DevIOAmplitude.h | 59 + .../CalibrationTool/include/DevIOArrayDataX.h | 59 + .../CalibrationTool/include/DevIOArrayDataY.h | 59 + .../CalibrationTool/include/DevIODataX.h | 59 + .../CalibrationTool/include/DevIODataY.h | 59 + .../CalibrationTool/include/DevIODeviceID.h | 59 + .../CalibrationTool/include/DevIOFileName.h | 58 + .../CalibrationTool/include/DevIOHPBW.h | 59 + .../CalibrationTool/include/DevIOObserver.h | 58 + .../CalibrationTool/include/DevIOOffset.h | 59 + .../CalibrationTool/include/DevIOPeakOffset.h | 59 + .../include/DevIOProjectName.h | 58 + .../CalibrationTool/include/DevIOScanAxis.h | 59 + .../include/DevIOScanIdentifier.h | 59 + .../CalibrationTool/include/DevIOSlope.h | 59 + .../CalibrationTool/include/DevIOSourceFlux.h | 59 + .../CalibrationTool/include/DevIOSourceName.h | 58 + .../CalibrationTool/include/DevIOStatus.h | 59 + .../CalibrationTool/include/EngineThread.h | 175 + .../include/ReceiverCallback.h | 40 + .../Servers/CalibrationTool/include/fgaus.h | 10 + Common/Servers/CalibrationTool/include/fit2.h | 12 + .../Servers/CalibrationTool/include/matin.h | 10 + .../src/CalibrationToolImpl.cpp | 304 + .../CalibrationTool/src/CollectorThread.cpp | 121 + .../CalibrationTool/src/CommonTools.cpp | 219 + .../CalibrationTool/src/Configuration.cpp | 79 + .../CalibrationTool/src/DataCollection.cpp | 357 + .../CalibrationTool/src/EngineThread.cpp | 1606 +++ .../src/EngineThread4CTsimulator.cpp | 743 ++ Common/Servers/CalibrationTool/src/Makefile | 97 + .../CalibrationTool/src/ReceiverCallback.cpp | 88 + .../CalibrationTool/src/TestWriter.cpp | 157 + Common/Servers/CalibrationTool/src/fgaus.c | 75 + Common/Servers/CalibrationTool/src/fgaus.f | 28 + Common/Servers/CalibrationTool/src/fit2.c | 359 + Common/Servers/CalibrationTool/src/fit2.f | 62 + Common/Servers/CalibrationTool/src/matin.c | 169 + Common/Servers/CalibrationTool/src/matin.f | 84 + .../src/testBulkTransmission.cpp | 239 + .../config/CDB/schemas/CustomLogger.xsd | 39 + .../CustomLogger/include/CustomLoggerImpl.h | 202 + .../CustomLogger/include/expat_log_parsing.h | 151 + .../CustomLogger/src/CustomLoggerImpl.cpp | 645 + Common/Servers/CustomLogger/src/Makefile | 70 + .../CustomLogger/src/expat_log_parsing.cpp | 310 + Common/Servers/CustomLogger/test/log_bomber | 26 + .../Servers/CustomLogger/test/log_continuous | 27 + .../Servers/CustomLogger/test/log_malformed | 21 + .../CustomLogger/test/logrotate.script | 8 + Common/Servers/CustomLogger/tests/.discos | 5 + Common/Servers/CustomLogger/tests/Makefile | 98 + .../CustomLogger/tests/external/__init__.py | 0 .../CustomLogger/tests/functional/__init__.py | 0 .../tests/functional/logging_process.py | 17 + .../tests/functional/test_logging.py | 253 + .../CustomLogger/tests/pyunit/__init__.py | 0 .../Servers/CustomLogger/tests/unittest.cpp | 33 + .../Servers/DBBC/config/CDB/schemas/DBBC.xsd | 67 + Common/Servers/DBBC/include/Common.h | 60 + Common/Servers/DBBC/include/Cpld2Intf.h | 43 + Common/Servers/DBBC/include/Cpld2IntfClient.h | 53 + Common/Servers/DBBC/include/DBBCImpl.h | 152 + Common/Servers/DBBC/include/SocketClient.h | 22 + .../Servers/DBBC/include/SocketConnection.h | 57 + Common/Servers/DBBC/src/Cpld2Intf.cpp | 83 + Common/Servers/DBBC/src/Cpld2IntfClient.cpp | 124 + Common/Servers/DBBC/src/DBBCImpl.cpp | 159 + Common/Servers/DBBC/src/Makefile | 208 + Common/Servers/DBBC/src/SocketClient.cpp | 47 + Common/Servers/DBBC/src/SocketConnection.cpp | 220 + .../config/CDB/schemas/ExternalClients.xsd | 34 + .../config/CDB/schemas/RFIMonitoring.xsd | 34 + .../ExternalClients/doc/ComandiNURAGHE.doc | Bin 0 -> 117248 bytes .../ExternalClients/include/Configuration.h | 63 + .../ExternalClients/include/DevIOStatus.h | 67 + .../include/ExternalClientsImpl.h | 117 + .../include/ExternalClientsSocketServer.h | 129 + .../include/ExternalClientsThread.h | 72 + .../ExternalClients/src/Configuration.cpp | 51 + .../src/ExternalClientsImpl.cpp | 171 + .../src/ExternalClientsSocketServer.cpp | 550 + .../src/ExternalClientsThread.cpp | 36 + Common/Servers/ExternalClients/src/Makefile | 207 + Common/Servers/ExternalClients/test/Makefile | 90 + .../ExternalClients/test/external/__init__.py | 0 .../test/functional/__init__.py | 0 .../test/functional/test_extclient.py | 48 + .../test/no_auto/LinuxSocket/ClientSocket.cpp | 42 + .../test/no_auto/LinuxSocket/ClientSocket.h | 22 + .../test/no_auto/LinuxSocket/Makefile | 29 + .../test/no_auto/LinuxSocket/ServerSocket.cpp | 59 + .../test/no_auto/LinuxSocket/ServerSocket.h | 25 + .../test/no_auto/LinuxSocket/Socket.cpp | 192 + .../test/no_auto/LinuxSocket/Socket.h | 53 + .../no_auto/LinuxSocket/SocketException.h | 23 + .../test/no_auto/LinuxSocket/simple_client | Bin 0 -> 17381 bytes .../LinuxSocket/simple_client_main.cpp | 33 + .../test/no_auto/LinuxSocket/simple_server | Bin 0 -> 18110 bytes .../LinuxSocket/simple_server_main.cpp | 41 + .../ExternalClients/test/pyunit/__init__.py | 0 .../Servers/ExternalClients/test/unittest.cpp | 6 + .../config/CDB/schemas/FitsWriter.xsd | 69 + Common/Servers/FitsWriter/doc/install.readme | 21 + .../FitsWriter/include/CollectorThread.h | 95 + .../Servers/FitsWriter/include/CommonTools.h | 119 + .../FitsWriter/include/Configuration.h | 132 + .../FitsWriter/include/DataCollection.h | 653 + .../FitsWriter/include/DevIODeviceID.h | 83 + .../FitsWriter/include/DevIOFileName.h | 58 + .../FitsWriter/include/DevIOObserver.h | 58 + .../FitsWriter/include/DevIOProjectName.h | 58 + .../FitsWriter/include/DevIOScanAxis.h | 58 + .../Servers/FitsWriter/include/DevIOStatus.h | 58 + .../Servers/FitsWriter/include/EngineThread.h | 132 + Common/Servers/FitsWriter/include/File.h | 302 + .../Servers/FitsWriter/include/FileCreator.h | 8 + Common/Servers/FitsWriter/include/FitsTools.h | 224 + .../Servers/FitsWriter/include/FitsWriter.h | 404 + .../FitsWriter/include/FitsWriterImpl.h | 213 + Common/Servers/FitsWriter/include/MetaData.h | 325 + .../FitsWriter/include/ReceiverCallback.h | 39 + .../FitsWriter/include/SummarySchema.h | 62 + .../FitsWriter/include/SummaryWriter.h | 89 + Common/Servers/FitsWriter/include/Version.h | 39 + .../FitsWriter/src/CollectorThread.cpp | 161 + Common/Servers/FitsWriter/src/CommonTools.cpp | 273 + .../Servers/FitsWriter/src/Configuration.cpp | 72 + .../Servers/FitsWriter/src/DataCollection.cpp | 441 + .../Servers/FitsWriter/src/EngineThread.cpp | 1387 ++ Common/Servers/FitsWriter/src/File.cpp | 137 + Common/Servers/FitsWriter/src/FitsTools.cpp | 80 + Common/Servers/FitsWriter/src/FitsWriter.cpp | 704 ++ .../Servers/FitsWriter/src/FitsWriterImpl.cpp | 312 + Common/Servers/FitsWriter/src/Makefile | 112 + Common/Servers/FitsWriter/src/MetaData.cpp | 54 + .../FitsWriter/src/ReceiverCallback.cpp | 91 + .../Servers/FitsWriter/src/SummaryWriter.cpp | 89 + Common/Servers/FitsWriter/src/TestSummary.cpp | 45 + Common/Servers/FitsWriter/src/TestWriter.cpp | 183 + .../FitsWriter/src/testBulkTransmission.cpp | 344 + Common/Servers/HeliumLine/ChangeLog | 1 + .../HeliumLine/config/CDB/schemas/schema | 0 .../Servers/HeliumLine/include/CommandLine.h | 40 + .../HeliumLine/include/DevIOreturnPressure.h | 96 + .../HeliumLine/include/DevIOsupplyPressure.h | 92 + .../HeliumLine/include/HeliumLineImpl.h | 65 + Common/Servers/HeliumLine/src/CommandLine.cpp | 84 + .../Servers/HeliumLine/src/HeliumLineImpl.cpp | 155 + Common/Servers/HeliumLine/src/Makefile | 175 + Common/Servers/HeliumLine/src/a.out | Bin 0 -> 10409 bytes .../HeliumLine/src/testCommandLine.cpp | 26 + .../HolographyBackend/include/CommandLine.h | 624 + .../HolographyBackend/include/Configuration.h | 67 + .../include/DevIODigitalXCorrelator.h | 52 + .../include/HolographyImpl.h | 497 + .../HolographyBackend/include/SenderThread.h | 95 + .../HolographyBackend/src/Configuration.cpp | 49 + .../DigitalXCorrelator.py | 278 + .../src/DigitalXCorrelatorImpl/__init__.py | 0 .../DigitalXCorrelator.py | 192 + .../HolographyBackend/src/HolographyImpl.cpp | 672 + Common/Servers/HolographyBackend/src/Makefile | 232 + .../HolographyBackend/src/SenderThread.cpp | 102 + .../HolographyBackend/src/corr2serial.py | 203 + .../HolographyBackend/src/serial/__init__.py | 26 + .../HolographyBackend/src/serial/serialcli.py | 271 + .../src/serial/serialjava.py | 260 + .../src/serial/serialposix.py | 612 + .../src/serial/serialutil.py | 478 + .../src/serial/serialwin32.py | 383 + .../HolographyBackend/src/serial/sermsdos.py | 200 + .../HolographyBackend/src/serial/win32.py | 288 + .../LocalOscillator/include/CommandLine.h | 131 + .../LocalOscillator/include/DevIOamplitude.h | 103 + .../LocalOscillator/include/DevIOfrequency.h | 103 + .../LocalOscillator/include/DevIOislocked.h | 133 + .../include/LocalOscillatorImpl.h | 74 + .../LocalOscillator/src/.idl-compilation-end | 0 .../src/.idl-compilation-start | 0 .../LocalOscillator/src/CommandLine.cpp | 409 + .../src/LocalOscillatorImpl.cpp | 294 + Common/Servers/LocalOscillator/src/Makefile | 233 + .../LocalOscillator/src/testCommandLine.cpp | 74 + .../AntennaParameters/AntennaParameters.xml | 113 + .../PointingParameters/PointingParameters.xml | 80 + .../DataBlock/TimeData/TimeData.xml | 15 + .../MBFitsWriter/MANAGEMENT/MBFitsWriter.xml | 32 + .../config/CDB/schemas/AntennaParameters.xsd | 38 + .../config/CDB/schemas/MBFitsWriter.xsd | 78 + .../config/CDB/schemas/PointingParameters.xsd | 94 + .../config/CDB/schemas/TimeData.xsd | 29 + .../Servers/MBFitsWriter/include/Baseband.h | 93 + .../MBFitsWriter/include/CollectorThread.h | 114 + .../MBFitsWriter/include/CommonTools.h | 99 + .../MBFitsWriter/include/Configuration.h | 121 + .../MBFitsWriter/include/DataCollection.h | 765 ++ .../MBFitsWriter/include/DevIOFileName.h | 58 + .../MBFitsWriter/include/DevIOStatus.h | 58 + .../MBFitsWriter/include/EngineThread.h | 138 + .../Servers/MBFitsWriter/include/FitsWriter.h | 383 + Common/Servers/MBFitsWriter/include/Layout.h | 40 + .../MBFitsWriter/include/LayoutCollection.h | 33 + .../MBFitsWriter/include/MBFitsManager.h | 756 ++ .../MBFitsWriter/include/MBFitsWriter.h | 562 + .../MBFitsWriter/include/MBFitsWriterImpl.h | 195 + .../MBFitsWriter/include/MBFitsWriterTable.h | 150 + .../MBFitsWriter/include/ReceiverCallback.h | 39 + Common/Servers/MBFitsWriter/include/Scan.h | 156 + .../MBFitsWriter/include/SpectralAxis.h | 46 + .../MBFitsWriter/src/.idl-compilation-end | 0 .../MBFitsWriter/src/.idl-compilation-start | 0 Common/Servers/MBFitsWriter/src/Baseband.cpp | 193 + .../MBFitsWriter/src/CollectorThread.cpp | 255 + .../Servers/MBFitsWriter/src/CommonTools.cpp | 210 + .../MBFitsWriter/src/Configuration.cpp | 73 + .../MBFitsWriter/src/DataCollection.cpp | 303 + .../Servers/MBFitsWriter/src/EngineThread.cpp | 2854 +++++ .../Servers/MBFitsWriter/src/FitsWriter.cpp | 556 + Common/Servers/MBFitsWriter/src/Layout.cpp | 69 + .../MBFitsWriter/src/LayoutCollection.cpp | 118 + .../MBFitsWriter/src/MBFitsManager.cpp | 1933 +++ .../Servers/MBFitsWriter/src/MBFitsWriter.cpp | 1437 +++ .../MBFitsWriter/src/MBFitsWriterImpl.cpp | 480 + .../MBFitsWriter/src/MBFitsWriterTable.cpp | 98 + Common/Servers/MBFitsWriter/src/Makefile | 229 + .../MBFitsWriter/src/ReceiverCallback.cpp | 94 + Common/Servers/MBFitsWriter/src/Scan.cpp | 424 + .../Servers/MBFitsWriter/src/SpectralAxis.cpp | 103 + .../MBFitsWriter/src/TestMBFitsWriter.cpp | 748 ++ Common/Servers/Makefile | 175 + Common/Servers/Moon/include/MoonImpl.h | 212 + Common/Servers/Moon/src/Makefile | 89 + Common/Servers/Moon/src/MoonImpl.cpp | 339 + Common/Servers/Moon/src/test_moon.cpp | 101 + Common/Servers/NewFitsWriter/include/File.h | 573 + .../NewFitsWriter/include/FileCreator.h | 26 + .../Servers/NewFitsWriter/include/FitsTools.h | 503 + .../NewFitsWriter/include/FitsWriterImpl.h | 208 + .../NewFitsWriter/include/ReceiverCallback.h | 39 + .../Servers/NewFitsWriter/include/SubScan.h | 19 + .../NewFitsWriter/include/SubScanSchema.h | 64 + .../Servers/NewFitsWriter/include/Summary.h | 17 + .../NewFitsWriter/include/SummarySchema.h | 61 + .../Servers/NewFitsWriter/include/Version.h | 38 + Common/Servers/NewFitsWriter/src/File.cpp | 301 + .../Servers/NewFitsWriter/src/FitsTools.cpp | 104 + .../NewFitsWriter/src/FitsWriterImpl.cpp | 300 + Common/Servers/NewFitsWriter/src/Makefile | 102 + .../NewFitsWriter/src/ReceiverCallback.cpp | 85 + Common/Servers/NewFitsWriter/src/SubScan.cpp | 11 + Common/Servers/NewFitsWriter/src/Summary.cpp | 12 + .../Servers/NewFitsWriter/tests/File_test.i | 247 + .../NewFitsWriter/tests/FitsTools_test.i | 126 + Common/Servers/NewFitsWriter/tests/Makefile | 90 + .../Servers/NewFitsWriter/tests/TestSchema.h | 43 + .../NewFitsWriter/tests/TestSchemaCreator.h | 24 + .../NewFitsWriter/tests/external/__init__.py | 0 .../tests/functional/__init__.py | 0 .../NewFitsWriter/tests/pyunit/__init__.py | 0 .../Servers/NewFitsWriter/tests/unittest.cpp | 46 + .../config/CDB/schemas/NoiseGenerator.xsd | 70 + .../NoiseGenerator/include/CommandLine.h | 332 + .../Servers/NoiseGenerator/include/Common.h | 32 + .../NoiseGenerator/include/Configuration.h | 60 + .../NoiseGenerator/include/ControlThread.h | 73 + .../NoiseGenerator/include/DevIOAttenuation.h | 96 + .../NoiseGenerator/include/DevIOBandWidth.h | 90 + .../NoiseGenerator/include/DevIOBins.h | 93 + .../NoiseGenerator/include/DevIOBusy.h | 98 + .../NoiseGenerator/include/DevIOFeed.h | 92 + .../NoiseGenerator/include/DevIOFrequency.h | 92 + .../include/DevIOInputSection.h | 92 + .../include/DevIOInputsNumber.h | 95 + .../NoiseGenerator/include/DevIOIntegration.h | 95 + .../include/DevIOPolarization.h | 93 + .../NoiseGenerator/include/DevIOSampleRate.h | 92 + .../include/DevIOSectionsNumber.h | 95 + .../NoiseGenerator/include/DevIOStatus.h | 95 + .../NoiseGenerator/include/DevIOTime.h | 93 + .../NoiseGenerator/include/DevIOTsys.h | 94 + .../include/NoiseGeneratorImpl.h | 434 + .../Servers/NoiseGenerator/include/Protocol.h | 22 + .../NoiseGenerator/include/SenderThread.h | 114 + .../NoiseGenerator/src/CommandLine.cpp | 430 + .../NoiseGenerator/src/Configuration.cpp | 44 + .../NoiseGenerator/src/ControlThread.cpp | 43 + Common/Servers/NoiseGenerator/src/Makefile | 213 + .../NoiseGenerator/src/NoiseGeneratorImpl.cpp | 492 + .../Servers/NoiseGenerator/src/Protocol.cpp | 32 + .../NoiseGenerator/src/SenderThread.cpp | 168 + Common/Servers/OTF/include/GreatCircle.h | 97 + Common/Servers/OTF/include/OTFImpl.h | 135 + Common/Servers/OTF/include/SubScan.h | 293 + Common/Servers/OTF/include/TextClient.h | 29 + Common/Servers/OTF/src/GreatCircle.cpp | 43 + Common/Servers/OTF/src/Makefile | 240 + Common/Servers/OTF/src/OTFImpl.cpp | 242 + Common/Servers/OTF/src/SubScan.cpp | 1487 +++ Common/Servers/OTF/src/TextClient.cpp | 714 ++ Common/Servers/OTF/src/TimeConverter.cpp | 108 + Common/Servers/OTF/src/testSubScan.cpp | 189 + .../config/CDB/schemas/Observatory.xsd | 52 + .../Observatory/include/ObservatoryDevIOs.h | 303 + .../Observatory/include/ObservatoryImpl.h | 273 + Common/Servers/Observatory/src/Makefile | 88 + .../Observatory/src/ObservatoryImpl.cpp | 363 + Common/Servers/PointingModel/ChangeLog | 1 + .../PointingModel/include/PointingModelImpl.h | 148 + Common/Servers/PointingModel/src/Makefile | 228 + .../PointingModel/src/PointingModelImpl.cpp | 368 + .../Servers/PointingModel/src/TestClient.cpp | 76 + Common/Servers/PointingModel/src/getAzOff.cpp | 32 + Common/Servers/PointingModel/src/getElOff.cpp | 36 + Common/Servers/PyDewarPositioner/TODO.rst | 41 + .../config/CDB/schemas/DewarPositioner.xsd | 36 + .../Servers/PyDewarPositioner/doc/README.rst | 28 + .../PyDewarPositioner/doc/source/api.rst | 37 + .../PyDewarPositioner/doc/source/conf.py | 279 + .../doc/source/configurations.rst | 442 + .../PyDewarPositioner/doc/source/examples.rst | 4 + .../doc/source/images/.~lock.equispaced.odg# | 1 + .../doc/source/images/bestspace.png | Bin 0 -> 12973 bytes .../doc/source/images/bestspace.svg | 302 + .../doc/source/images/drawing.svg | 264 + .../doc/source/images/not_bestspace_gap.png | Bin 0 -> 13611 bytes .../source/images/not_bestspace_overlap.png | Bin 0 -> 12332 bytes .../source/images/not_bestspace_overlap.svg | 361 + .../PyDewarPositioner/doc/source/index.rst | 21 + .../PyDewarPositioner/doc/source/park.rst | 31 + .../doc/source/rewinding.rst | 167 + .../PyDewarPositioner/doc/source/setup.rst | 95 + .../doc/source/user_commands.rst | 22 + .../PyDewarPositioner/doc/tecnical/Makefile | 177 + .../doc/tecnical/source/api.rst | 37 + .../doc/tecnical/source/conf.py | 279 + .../doc/tecnical/source/configurations.rst | 442 + .../doc/tecnical/source/examples.rst | 4 + .../source/images/.~lock.equispaced.odg# | 1 + .../doc/tecnical/source/images/bestspace.png | Bin 0 -> 12973 bytes .../doc/tecnical/source/images/bestspace.svg | 302 + .../doc/tecnical/source/images/drawing.svg | 264 + .../source/images/not_bestspace_gap.png | Bin 0 -> 13611 bytes .../source/images/not_bestspace_overlap.png | Bin 0 -> 12332 bytes .../source/images/not_bestspace_overlap.svg | 361 + .../doc/tecnical/source/index.rst | 21 + .../doc/tecnical/source/park.rst | 31 + .../doc/tecnical/source/rewinding.rst | 167 + .../doc/tecnical/source/setup.rst | 95 + .../doc/tecnical/source/user_commands.rst | 22 + .../PyDewarPositioner/doc/user/Makefile | 183 + .../PyDewarPositioner/doc/user/source/api.rst | 37 + .../PyDewarPositioner/doc/user/source/conf.py | 301 + .../doc/user/source/configurations.rst | 442 + .../doc/user/source/examples.rst | 4 + .../user/source/images/.~lock.equispaced.odg# | 1 + .../doc/user/source/images/bestspace.png | Bin 0 -> 12973 bytes .../doc/user/source/images/bestspace.svg | 302 + .../doc/user/source/images/drawing.svg | 264 + .../user/source/images/not_bestspace_gap.png | Bin 0 -> 13611 bytes .../source/images/not_bestspace_overlap.png | Bin 0 -> 12332 bytes .../source/images/not_bestspace_overlap.svg | 361 + .../doc/user/source/index.rst | 17 + .../doc/user/source/intro.rst | 17 + .../doc/user/source/operator_input.rst | 332 + .../doc/user/source/park.rst | 33 + .../doc/user/source/rewinding.rst | 167 + .../doc/user/source/setup.rst | 5 + .../doc/user/source/user_commands.rst | 22 + .../DewarPositioner/DewarPositionerImpl.py | 738 ++ .../src/DewarPositioner/__init__.py | 0 .../src/DewarPositioner/cdbconf.py | 285 + .../src/DewarPositioner/devios.py | 9 + .../src/DewarPositioner/posgenerator.py | 133 + .../src/DewarPositioner/positioner.py | 786 ++ Common/Servers/PyDewarPositioner/src/Makefile | 42 + .../src/derotatorPosition.py | 22 + .../test/DewarPositionerMockers/__init__.py | 0 .../DewarPositionerMockers/mock_components.py | 103 + .../Servers/PyDewarPositioner/test/Makefile | 94 + .../Servers/PyDewarPositioner/test/README.rst | 70 + .../test/dependencies/coverage-3.7.1.tar.gz | Bin 0 -> 284735 bytes .../test/dependencies/mocker-1.1.1.tar.bz2 | Bin 0 -> 36357 bytes .../test/dependencies/unittest2-0.5.1.tar.gz | Bin 0 -> 62470 bytes .../test/external/__init__.py | 0 .../test/functional/__init__.py | 0 .../test/functional/commands/__init__.py | 0 .../test/functional/commands/test_command.py | 48 + .../test_derotatorClearAutoRewindingSteps.py | 25 + .../commands/test_derotatorGetCmdPosition.py | 26 + .../commands/test_derotatorGetMaxLimit.py | 18 + .../commands/test_derotatorGetMinLimit.py | 18 + .../test_derotatorGetRewindingStep.py | 22 + .../commands/test_derotatorGetScanInfo.py | 16 + .../commands/test_derotatorIsReady.py | 18 + .../test_derotatorIsRewindingRequired.py | 19 + .../commands/test_derotatorIsUpdating.py | 17 + .../functional/commands/test_derotatorPark.py | 24 + .../commands/test_derotatorRewind.py | 22 + .../test_derotatorSetConfiguration.py | 24 + .../commands/test_derotatorSetup.py | 18 + .../test_derotatorXetAutoRewindingSteps.py | 27 + .../commands/test_derotatorXetPosition.py | 40 + .../test_derotatorXetRewindingMode.py | 24 + .../functional/configurations/__init__.py | 0 .../functional/configurations/test_bsc.py | 30 + .../functional/configurations/test_bsc_opt.py | 29 + .../functional/configurations/test_custom.py | 30 + .../configurations/test_custom_opt.py | 29 + .../functional/configurations/test_fixed.py | 30 + .../functional/configurations/test_generic.py | 29 + .../test/functional/test_get-setPosition.py | 47 + .../functional/test_getManagementStatus.py | 28 + .../functional/test_getPositionFromHistory.py | 74 + .../test/functional/test_getScanInfo.py | 20 + .../test/functional/test_isReady.py | 26 + .../test/functional/test_isSlewing.py | 30 + .../test/functional/test_nchannel.py | 82 + .../test/functional/test_offset.py | 45 + .../test/functional/test_park.py | 32 + .../test/functional/test_rewind.py | 321 + .../test/functional/test_rewindingmodes.py | 25 + .../test/functional/test_setup.py | 42 + .../test/functional/test_status_property.py | 32 + .../test/interface/commands/test_command.py | 48 + .../test_derotatorClearAutoRewindingSteps.py | 25 + .../commands/test_derotatorGetCmdPosition.py | 26 + .../test_derotatorGetRewindingStep.py | 22 + .../commands/test_derotatorGetScanInfo.py | 16 + .../commands/test_derotatorIsReady.py | 18 + .../test_derotatorIsRewindingRequired.py | 19 + .../commands/test_derotatorIsUpdating.py | 17 + .../interface/commands/test_derotatorPark.py | 24 + .../commands/test_derotatorRewind.py | 22 + .../test_derotatorSetConfiguration.py | 24 + .../interface/commands/test_derotatorSetup.py | 18 + .../test_derotatorXetAutoRewindingSteps.py | 27 + .../commands/test_derotatorXetPosition.py | 32 + .../test_derotatorXetRewindingMode.py | 24 + .../test/interface/configurations/test_bsc.py | 30 + .../interface/configurations/test_bsc_opt.py | 29 + .../interface/configurations/test_custom.py | 30 + .../configurations/test_custom_opt.py | 29 + .../interface/configurations/test_fixed.py | 30 + .../interface/configurations/test_generic.py | 29 + .../test/interface/test_get-setPosition.py | 34 + .../interface/test_getManagementStatus.py | 28 + .../interface/test_getPositionFromHistory.py | 72 + .../test/interface/test_getScanInfo.py | 20 + .../test/interface/test_isReady.py | 26 + .../test/interface/test_isSlewing.py | 30 + .../test/interface/test_nchannel.py | 82 + .../test/interface/test_offset.py | 45 + .../test/interface/test_park.py | 32 + .../test/interface/test_rewind.py | 32 + .../test/interface/test_rewindingmodes.py | 25 + .../test/interface/test_setup.py | 42 + .../test/interface/test_status_property.py | 32 + .../test/no_auto/updatePositionValues.py | 62 + .../PyDewarPositioner/test/pyunit/__init__.py | 0 .../test/pyunit/cdbconf/__init__.py | 0 .../test/pyunit/cdbconf/test_cdbconf.py | 101 + .../test/pyunit/devios/__init__.py | 0 .../test/pyunit/devios/test_status.py | 34 + .../test/pyunit/posgen/__init__.py | 0 .../posgen/test_galactic_parallactic.py | 53 + .../test/pyunit/posgen/test_goto.py | 15 + .../test/pyunit/posgen/test_parallactic.py | 64 + .../test/pyunit/positioner/__init__.py | 0 .../test/pyunit/positioner/test_dec2bin.py | 15 + .../pyunit/positioner/test_getScanInfo.py | 82 + .../test/pyunit/positioner/test_goTo.py | 42 + .../test/pyunit/positioner/test_init.py | 22 + .../test/pyunit/positioner/test_offset.py | 89 + .../test/pyunit/positioner/test_park.py | 42 + .../test/pyunit/positioner/test_setup.py | 55 + .../pyunit/positioner/test_startUpdating.py | 306 + .../test/pyunit/positioner/test_status.py | 155 + .../test/pyunit/positioner/test_stop.py | 45 + .../test/pyunit/publisher/__init__.py | 0 .../test/pyunit/publisher/test_publisher.py | 236 + .../PyDewarPositioner/test/run_coverage | 6 + .../PyDewarPositioner/test/unittest.cpp | 6 + Common/Servers/PyLocalOscillator/ChangeLog | 1 + .../src/LocalOscillatorImpl/CommandLine.py | 199 + .../LocalOscillatorImpl/LocalOscillator.py | 151 + .../LocalOscillatorImpl/LocalOscillatorSim.py | 103 + .../src/LocalOscillatorImpl/__init__.py | 0 .../src/LocalOscillatorImpl/devios.py | 91 + .../LocalOscillatorSimImpl/LocalOscillator.py | 40 + .../src/LocalOscillatorSimImpl/__init__.py | 0 .../src/LocalOscillatorSimImpl/devios.py | 15 + Common/Servers/PyLocalOscillator/src/Makefile | 210 + .../test/test_commandline.py | 77 + .../PyLocalOscillator/test/test_component.py | 25 + Common/Servers/PyWeatherStation/ChangeLog | 1 + .../CDB/schemas/EnhancedWeatherStation.xsd | 23 + .../config/CDB/schemas/WeatherStationData.xsd | 25 + Common/Servers/PyWeatherStation/src/Makefile | 207 + .../src/WeatherStationImpl/WeatherStation.py | 64 + .../src/WeatherStationImpl/cdbjDAL.gclog | 1668 +++ .../src/WeatherStationImpl/jmanager.gclog | 224 + .../config/CDB/schemas/ReceiversBoss.xsd | 67 + .../ReceiversBoss/include/Configuration.h | 93 + .../ReceiversBoss/include/DevIOBandWidth.h | 75 + .../include/DevIODerotatorPosition.h | 74 + .../ReceiversBoss/include/DevIOFeeds.h | 75 + .../Servers/ReceiversBoss/include/DevIOIFs.h | 76 + .../include/DevIOInitialFrequency.h | 75 + .../Servers/ReceiversBoss/include/DevIOLO.h | 76 + .../Servers/ReceiversBoss/include/DevIOMode.h | 51 + .../ReceiversBoss/include/DevIOPolarization.h | 76 + .../ReceiversBoss/include/DevIORecvCode.h | 51 + .../ReceiversBoss/include/DevIOStatus.h | 51 + .../ReceiversBoss/include/ReceiversBossImpl.h | 462 + .../ReceiversBoss/include/RecvBossCore.h | 410 + .../ReceiversBoss/include/WatchingThread.h | 56 + .../ReceiversBoss/src/Configuration.cpp | 111 + Common/Servers/ReceiversBoss/src/Makefile | 124 + .../ReceiversBoss/src/ReceiversBossImpl.cpp | 794 ++ .../ReceiversBoss/src/RecvBossCore.cpp | 2154 ++++ .../ReceiversBoss/src/RecvBossCore_mc.i | 1178 ++ .../ReceiversBoss/src/RecvBossCore_nt.i | 752 ++ .../ReceiversBoss/src/WatchingThread.cpp | 55 + Common/Servers/Refraction/ChangeLog | 1 + .../config/CDB/schemas/Refraction.xsd | 22 + .../Refraction/include/RefractionCore.h | 119 + .../Refraction/include/RefractionImpl.h | 104 + .../include/RefractionWorkingThread.h | 61 + Common/Servers/Refraction/src/Makefile | 235 + .../Servers/Refraction/src/RefractionCore.cpp | 166 + .../Servers/Refraction/src/RefractionImpl.cpp | 108 + .../src/RefractionWorkingThread.cpp | 35 + Common/Servers/Refraction/src/TestClient.cpp | 92 + Common/Servers/Refraction/src/TestIter.cpp | 68 + Common/Servers/Refraction/src/TestRefro.cpp | 34 + Common/Servers/Refraction/src/medrefrw1.cpp | 41 + Common/Servers/Refraction/src/medrefrw2.cpp | 43 + Common/Servers/Refraction/test/NuovaDati.txt | 107 + .../Servers/Refraction/test/VecchiaDati.txt | 299 + .../Roach/config/CDB/schemas/Roach.xsd | 134 + .../Roach/config/CDB/schemas/RoachSetup.xsd | 141 + Common/Servers/Roach/include/CommandLine.h | 753 ++ Common/Servers/Roach/include/Common.h | 51 + Common/Servers/Roach/include/Configuration.h | 196 + Common/Servers/Roach/include/ControlThread.h | 73 + .../Servers/Roach/include/DevIOAttenuation.h | 97 + Common/Servers/Roach/include/DevIOBandWidth.h | 93 + Common/Servers/Roach/include/DevIOBins.h | 94 + Common/Servers/Roach/include/DevIOBusy.h | 99 + Common/Servers/Roach/include/DevIOFeed.h | 93 + Common/Servers/Roach/include/DevIOFrequency.h | 94 + .../Servers/Roach/include/DevIOInputSection.h | 93 + .../Servers/Roach/include/DevIOInputsNumber.h | 96 + .../Servers/Roach/include/DevIOIntegration.h | 96 + .../Servers/Roach/include/DevIOPolarization.h | 94 + .../Servers/Roach/include/DevIOSampleRate.h | 93 + .../Roach/include/DevIOSectionsNumber.h | 96 + Common/Servers/Roach/include/DevIOStatus.h | 96 + Common/Servers/Roach/include/DevIOTime.h | 95 + Common/Servers/Roach/include/DevIOTsys.h | 95 + Common/Servers/Roach/include/Protocol.h | 345 + Common/Servers/Roach/include/RoachImpl.h | 504 + Common/Servers/Roach/include/SenderThread.h | 169 + Common/Servers/Roach/src/CommandLine.cpp | 1935 +++ Common/Servers/Roach/src/Configuration.cpp | 224 + Common/Servers/Roach/src/ControlThread.cpp | 43 + Common/Servers/Roach/src/Makefile | 214 + Common/Servers/Roach/src/Protocol.cpp | 596 + Common/Servers/Roach/src/RoachImpl.cpp | 898 ++ Common/Servers/Roach/src/SenderThread.cpp | 358 + .../Servers/Roach/src/_send_backend_command | 37 + .../config/CDB/schemas/Scheduler.xsd | 90 + .../Servers/Scheduler/include/Configuration.h | 265 + Common/Servers/Scheduler/include/Core.h | 189 + Common/Servers/Scheduler/include/Core_Basic.h | 153 + .../Servers/Scheduler/include/Core_Common.h | 210 + Common/Servers/Scheduler/include/Core_Extra.h | 38 + .../Servers/Scheduler/include/Core_Getter.h | 78 + .../Scheduler/include/Core_Operations.h | 261 + .../Servers/Scheduler/include/Core_Resource.h | 386 + .../Scheduler/include/DevIOCurrentBackend.h | 56 + .../Scheduler/include/DevIOCurrentDevice.h | 51 + .../Scheduler/include/DevIOCurrentRecorder.h | 56 + .../Scheduler/include/DevIOProjectCode.h | 56 + .../Scheduler/include/DevIORestFrequency.h | 73 + .../Scheduler/include/DevIOScanNumber.h | 66 + .../Scheduler/include/DevIOScheduleName.h | 58 + .../Servers/Scheduler/include/DevIOStatus.h | 58 + .../Servers/Scheduler/include/DevIOTracking.h | 65 + Common/Servers/Scheduler/include/Schedule.h | 937 ++ .../Scheduler/include/ScheduleExecutor.h | 412 + .../Scheduler/include/ScheduleReport.h | 85 + .../Servers/Scheduler/include/SchedulerImpl.h | 469 + .../Servers/Scheduler/src/Configuration.cpp | 348 + Common/Servers/Scheduler/src/Core.cpp | 476 + Common/Servers/Scheduler/src/Core_Basic.i | 573 + Common/Servers/Scheduler/src/Core_Common.i | 685 + Common/Servers/Scheduler/src/Core_Extra.i | 195 + Common/Servers/Scheduler/src/Core_Getter.i | 75 + .../Servers/Scheduler/src/Core_Operations.i | 1122 ++ Common/Servers/Scheduler/src/Core_Resource.i | 529 + Common/Servers/Scheduler/src/Makefile | 219 + Common/Servers/Scheduler/src/Schedule.cpp | 1267 ++ .../Servers/Scheduler/src/ScheduleChecker.cpp | 88 + .../Scheduler/src/ScheduleExecutor.cpp | 867 ++ .../Servers/Scheduler/src/ScheduleReport.cpp | 232 + .../Scheduler/src/Schedule_ScanList.cpp | 1544 +++ .../Servers/Scheduler/src/SchedulerImpl.cpp | 598 + .../Servers/Scheduler/src/SubScanBinder.cpp | 482 + Common/Servers/Scheduler/src/_tp_agc.py | 82 + Common/Servers/Scheduler/src/testLST2UT.cpp | 147 + Common/Servers/Scheduler/src/testSchedule.cpp | 193 + .../Scheduler/templates/MapVirgo1x1.bck | 2 + .../Scheduler/templates/MapVirgo1x1.cfg | 13 + .../Scheduler/templates/MapVirgo1x1.lis | 208 + .../Scheduler/templates/MapVirgo1x1.scd | 85 + Common/Servers/Scheduler/templates/Test.bck | 5 + Common/Servers/Scheduler/templates/Test.cfg | 15 + Common/Servers/Scheduler/templates/Test.lis | 7 + .../Servers/Scheduler/templates/TestLST.scd | 130 + .../Servers/Scheduler/templates/backend.tmpl | 34 + Common/Servers/Scheduler/templates/calib.bck | 12 + Common/Servers/Scheduler/templates/calib.cfg | 14 + Common/Servers/Scheduler/templates/calib.lis | 20 + Common/Servers/Scheduler/templates/calib.scd | 28 + .../Servers/Scheduler/templates/config.tmpl | 20 + .../Scheduler/templates/layoutfile.tmpl | 13 + .../Servers/Scheduler/templates/pointing.scd | 160 + .../Scheduler/templates/pointingBackend.cfg | 12 + .../templates/pointingCalibrators.lis | 79 + .../Scheduler/templates/pointingProcedure.cfg | 19 + Common/Servers/Scheduler/templates/scan.tmpl | 94 + .../Servers/Scheduler/templates/schedule.tmpl | 87 + Common/Servers/Scheduler/templates/skydip.bck | 4 + Common/Servers/Scheduler/templates/skydip.cfg | 12 + Common/Servers/Scheduler/templates/skydip.lis | 6 + Common/Servers/Scheduler/templates/skydip.scd | 14 + Common/Servers/Scheduler/tests/.discos | 0 Common/Servers/Scheduler/tests/Makefile | 90 + .../Scheduler/tests/ScheduleReport_test.i | 159 + .../tests/artefacts/schedule_text.aux | 2 + .../tests/artefacts/schedule_text.scd | 2 + .../Scheduler/tests/external/__init__.py | 0 .../Scheduler/tests/functional/__init__.py | 0 .../Scheduler/tests/gtest/procedurelist.cpp | 119 + Common/Servers/Scheduler/tests/procedure.cfg | 7 + .../Scheduler/tests/pyunit/__init__.py | 0 Common/Servers/Scheduler/tests/unittest.cpp | 19 + .../config/CDB/schemas/SourceCatalog.xsd | 200 + .../Servers/SkySource/include/SkySourceImpl.h | 241 + Common/Servers/SkySource/include/TextClient.h | 25 + Common/Servers/SkySource/src/Makefile | 136 + .../Servers/SkySource/src/SkySourceImpl.cpp | 442 + Common/Servers/SkySource/src/TextClient.cpp | 615 + .../config/CDB/schemas/TotalPower.xsd | 134 + .../config/CDB/schemas/TotalPowerSetup.xsd | 168 + .../Servers/TotalPower/include/CommandLine.h | 741 ++ Common/Servers/TotalPower/include/Common.h | 44 + .../TotalPower/include/Configuration.h | 214 + .../TotalPower/include/ControlThread.h | 73 + .../TotalPower/include/DevIOAttenuation.h | 97 + .../TotalPower/include/DevIOBandWidth.h | 93 + Common/Servers/TotalPower/include/DevIOBins.h | 94 + Common/Servers/TotalPower/include/DevIOBusy.h | 99 + Common/Servers/TotalPower/include/DevIOFeed.h | 93 + .../TotalPower/include/DevIOFrequency.h | 94 + .../TotalPower/include/DevIOInputSection.h | 93 + .../TotalPower/include/DevIOInputsNumber.h | 96 + .../TotalPower/include/DevIOIntegration.h | 96 + .../TotalPower/include/DevIOPolarization.h | 94 + .../TotalPower/include/DevIOSampleRate.h | 93 + .../TotalPower/include/DevIOSectionsNumber.h | 96 + .../Servers/TotalPower/include/DevIOStatus.h | 96 + Common/Servers/TotalPower/include/DevIOTime.h | 95 + Common/Servers/TotalPower/include/DevIOTsys.h | 95 + Common/Servers/TotalPower/include/Protocol.h | 381 + .../Servers/TotalPower/include/SenderThread.h | 169 + .../TotalPower/include/TotalPowerImpl.h | 526 + Common/Servers/TotalPower/src/CommandLine.cpp | 1783 +++ .../Servers/TotalPower/src/Configuration.cpp | 268 + .../Servers/TotalPower/src/ControlThread.cpp | 43 + Common/Servers/TotalPower/src/Makefile | 213 + Common/Servers/TotalPower/src/Protocol.cpp | 617 + .../Servers/TotalPower/src/SenderThread.cpp | 347 + .../Servers/TotalPower/src/TotalPowerImpl.cpp | 879 ++ Common/Servers/XBackend/Xbackend.xmi | 2327 ++++ .../XBackend/config/CDB/schemas/XBackends.xsd | 107 + Common/Servers/XBackend/include/CommandLine.h | 641 + Common/Servers/XBackend/include/Common.h | 65 + .../Servers/XBackend/include/Configuration.h | 129 + .../XBackend/include/DevIOAttenuation.h | 98 + .../Servers/XBackend/include/DevIOBandWidth.h | 94 + Common/Servers/XBackend/include/DevIOBins.h | 95 + Common/Servers/XBackend/include/DevIOBusy.h | 99 + Common/Servers/XBackend/include/DevIOFeed.h | 94 + .../Servers/XBackend/include/DevIOFileName.h | 59 + .../Servers/XBackend/include/DevIOFrequency.h | 94 + .../XBackend/include/DevIOInputSection.h | 94 + .../XBackend/include/DevIOInputsNumber.h | 96 + .../XBackend/include/DevIOIntegration.h | 97 + .../Servers/XBackend/include/DevIOMode8bit.h | 99 + .../XBackend/include/DevIOPolarization.h | 94 + .../XBackend/include/DevIOSampleRate.h | 93 + .../XBackend/include/DevIOSectionsNumber.h | 96 + Common/Servers/XBackend/include/DevIOStatus.h | 95 + Common/Servers/XBackend/include/DevIOTime.h | 95 + Common/Servers/XBackend/include/DevIOTsys.h | 95 + Common/Servers/XBackend/include/FitsWriter.h | 357 + Common/Servers/XBackend/include/Timer.h | 74 + .../Servers/XBackend/include/XBackendsImpl.h | 536 + Common/Servers/XBackend/include/XDataThread.h | 70 + .../Servers/XBackend/include/XarcosThread.h | 167 + Common/Servers/XBackend/src/CommandLine.cpp | 1896 +++ Common/Servers/XBackend/src/Configuration.cpp | 56 + Common/Servers/XBackend/src/FitsWriter.cpp | 413 + Common/Servers/XBackend/src/Makefile | 228 + Common/Servers/XBackend/src/Timer.cpp | 64 + Common/Servers/XBackend/src/XBackendsImpl.cpp | 1204 ++ Common/Servers/XBackend/src/XDataThread.cpp | 50 + Common/Servers/XBackend/src/XarcosThread.cpp | 731 ++ .../XBackend/test/xarcos_emulator/Adc.cpp | 11 + .../XBackend/test/xarcos_emulator/Adc.h | 15 + .../test/xarcos_emulator/ArcosEmulator.cpp | 62 + .../test/xarcos_emulator/ArcosEmulator.h | 25 + .../test/xarcos_emulator/CpldInterface.cpp | 336 + .../test/xarcos_emulator/CpldInterface.h | 33 + .../XBackend/test/xarcos_emulator/Dbbc.cpp | 128 + .../XBackend/test/xarcos_emulator/Dbbc.h | 44 + .../test/xarcos_emulator/Emulator.cpp | 54 + .../test/xarcos_emulator/FftSpectrometer.cpp | 152 + .../test/xarcos_emulator/FftSpectrometer.h | 37 + .../test/xarcos_emulator/HardwareBlock.h | 16 + .../test/xarcos_emulator/IntThread.cpp | 62 + .../XBackend/test/xarcos_emulator/IntThread.h | 49 + .../XBackend/test/xarcos_emulator/Makefile | 28 + .../test/xarcos_emulator/Semaphore.cpp | 94 + .../XBackend/test/xarcos_emulator/Semaphore.h | 66 + .../xarcos_emulator/SingleSpectrometer.cpp | 53 + .../test/xarcos_emulator/SingleSpectrometer.h | 20 + .../test/xarcos_emulator/SocketConnection.cpp | 277 + .../test/xarcos_emulator/SocketConnection.h | 134 + .../test/xarcos_emulator/SocketServer.cpp | 104 + .../test/xarcos_emulator/SocketServer.h | 56 + .../test/xarcos_emulator/Spectrometer.cpp | 75 + .../test/xarcos_emulator/Spectrometer.h | 17 + .../XBackend/test/xarcos_emulator/Thread.cpp | 49 + .../XBackend/test/xarcos_emulator/Thread.h | 157 + .../test/xarcos_emulator/TpThread.cpp | 54 + .../XBackend/test/xarcos_emulator/TpThread.h | 49 + .../test/xarcos_emulator/emulator.tex | 29 + Common/Servers/dummy.txt | 1 + .../src/AntennaBossSim/AntennaBossSimImpl.py | 145 + .../src/AntennaBossSim/__init__.py | 0 .../src/AntennaBossSim/devios.py | 11 + .../Components/PyAntennaBossSim/src/Makefile | 35 + .../Hardware/ReceiverBoardSim/src/Makefile | 36 + .../src/ReceiverBoardSimImpl/__init__.py | 0 .../src/ReceiverBoardSimImpl/board_server.py | 246 + .../ReceiverBoardSim/src/receiverboard-sim | 17 + .../TCPGenericProtocolSim/src/Makefile | 60 + .../TCPGenericProtocolSimImpl/TCPServer.py | 128 + .../src/TCPGenericProtocolSimImpl/__init__.py | 0 .../TCPGenericProtocolSim/src/tcpProt-sim | 38 + Common/Tests/test/Makefile | 90 + Common/Tests/test/cdb/__init__.py | 0 Common/Tests/test/cdb/test_procedures.py | 21 + Common/Tests/test/external/__init__.py | 0 Common/Tests/test/functional/__init__.py | 0 Common/Tests/test/pyunit/__init__.py | 0 Common/Tests/test/unittest.cpp | 6 + 1315 files changed, 222023 insertions(+) create mode 100644 Common/Clients/AntennaBossTextClient/include/AntennaBossTextClient.h create mode 100644 Common/Clients/AntennaBossTextClient/include/UpdateGenerator.i create mode 100644 Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp create mode 100644 Common/Clients/AntennaBossTextClient/src/Makefile create mode 100644 Common/Clients/AntennaBossTextClient/src/antennaBossTui create mode 100644 Common/Clients/AntennaBossTextClient/template/scanExample.scd create mode 100644 Common/Clients/CaltoolClient/src/Makefile create mode 100644 Common/Clients/CaltoolClient/src/calibrationToolClient.ui create mode 100644 Common/Clients/CaltoolClient/src/calibrationtoolclient.py create mode 100644 Common/Clients/CaltoolClient/src/customwidgets.py create mode 100644 Common/Clients/CustomLoggingClient/src/Makefile create mode 100755 Common/Clients/CustomLoggingClient/src/_gui_customLoggingClient.py create mode 100644 Common/Clients/CustomLoggingClient/src/loggingDisplay create mode 100644 Common/Clients/GenericBackendTextClient/include/BackendClient.h create mode 100644 Common/Clients/GenericBackendTextClient/src/BackendClient.cpp create mode 100644 Common/Clients/GenericBackendTextClient/src/Makefile create mode 100644 Common/Clients/GenericBackendTextClient/src/genericBackendTui create mode 100644 Common/Clients/Makefile create mode 100644 Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h create mode 100644 Common/Clients/MinorServoBossTextClient/src/Makefile create mode 100644 Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp create mode 100644 Common/Clients/MinorServoBossTextClient/src/minorservoBossTui create mode 100644 Common/Clients/ObservatoryTextClient/include/ObservatoryTextClient.h create mode 100644 Common/Clients/ObservatoryTextClient/src/Makefile create mode 100644 Common/Clients/ObservatoryTextClient/src/ObservatoryTextClient.cpp create mode 100644 Common/Clients/ObservatoryTextClient/src/observatoryTui create mode 100644 Common/Clients/ReceiversBossTextClient/include/ReceiversBossTextClient.h create mode 100644 Common/Clients/ReceiversBossTextClient/src/Makefile create mode 100644 Common/Clients/ReceiversBossTextClient/src/ReceiversBossTextClient.cpp create mode 100644 Common/Clients/ReceiversBossTextClient/src/receiversBossTui create mode 100644 Common/Clients/ReceiversBossTextClient/src/updateDewar.i create mode 100644 Common/Clients/SchedulerTextClient/include/SchedulerTuiClient.h create mode 100644 Common/Clients/SchedulerTextClient/src/Makefile create mode 100644 Common/Clients/SchedulerTextClient/src/SchedulerTuiClient.cpp create mode 100644 Common/Clients/SchedulerTextClient/src/schedulerTui create mode 100644 Common/Clients/SystemTerminal/src/Makefile create mode 100644 Common/Clients/SystemTerminal/src/_tui_SysTerm.py create mode 100755 Common/Clients/SystemTerminal/src/nuraghe_commands.py create mode 100644 Common/Clients/SystemTerminal/src/operatorInput create mode 100644 Common/Clients/XBackendClient/.cproject create mode 100644 Common/Clients/XBackendClient/.project create mode 100644 Common/Clients/XBackendClient/include/Data.h create mode 100644 Common/Clients/XBackendClient/include/DataIntegrazione.h create mode 100644 Common/Clients/XBackendClient/include/Led.h create mode 100644 Common/Clients/XBackendClient/include/Specifiche.h create mode 100644 Common/Clients/XBackendClient/include/XBackendsClient.h create mode 100644 Common/Clients/XBackendClient/include/XControlSystem.h create mode 100644 Common/Clients/XBackendClient/include/headResult.h create mode 100644 Common/Clients/XBackendClient/include/plot.h create mode 100644 Common/Clients/XBackendClient/include/xclientGUI.h create mode 100644 Common/Clients/XBackendClient/include/xclientGUIui.h create mode 100644 Common/Clients/XBackendClient/include/xplot.h create mode 100644 Common/Clients/XBackendClient/include/xplotGUI.h create mode 100644 Common/Clients/XBackendClient/src/.idl-compilation-end create mode 100644 Common/Clients/XBackendClient/src/.idl-compilation-start create mode 100644 Common/Clients/XBackendClient/src/Data.cpp create mode 100644 Common/Clients/XBackendClient/src/DataIntegrazione.cpp create mode 100644 Common/Clients/XBackendClient/src/Led.cpp create mode 100644 Common/Clients/XBackendClient/src/Makefile create mode 100644 Common/Clients/XBackendClient/src/Specifiche.cpp create mode 100644 Common/Clients/XBackendClient/src/XBackendsClient.cpp create mode 100644 Common/Clients/XBackendClient/src/XControlSystem.cpp create mode 100644 Common/Clients/XBackendClient/src/headResult.cpp create mode 100644 Common/Clients/XBackendClient/src/moc_XControlSystem.cpp create mode 100644 Common/Clients/XBackendClient/src/moc_plot.cpp create mode 100644 Common/Clients/XBackendClient/src/moc_xclientGUIui.cpp create mode 100644 Common/Clients/XBackendClient/src/moc_xplot.cpp create mode 100644 Common/Clients/XBackendClient/src/plot.cpp create mode 100644 Common/Clients/XBackendClient/src/xclientGUI.ui create mode 100644 Common/Clients/XBackendClient/src/xclientGUIui.cpp create mode 100644 Common/Clients/XBackendClient/src/xplot.cpp create mode 100644 Common/Clients/XBackendClient/src/xplotGUI.ui create mode 100644 Common/Clients/dummy.txt create mode 100644 Common/Documentation/dummy.txt create mode 100644 Common/Errors/AntennaErrors/idl/AntennaErrors.xml create mode 100644 Common/Errors/AntennaErrors/src/Makefile create mode 100644 Common/Errors/BackendsErrors/idl/BackendsErrors.xml create mode 100644 Common/Errors/BackendsErrors/src/Makefile create mode 100644 Common/Errors/ClientErrors/ChangeLog create mode 100644 Common/Errors/ClientErrors/idl/ClientErrors.xml create mode 100644 Common/Errors/ClientErrors/src/Makefile create mode 100644 Common/Errors/ComponentErrors/idl/.cvsignore create mode 100644 Common/Errors/ComponentErrors/idl/ComponentErrors.xml create mode 100644 Common/Errors/ComponentErrors/src/Makefile create mode 100644 Common/Errors/Makefile create mode 100644 Common/Errors/ManagementErrors/idl/ManagementErrors.xml create mode 100644 Common/Errors/ManagementErrors/src/Makefile create mode 100755 Common/Errors/MetrologyErrors/idl/ACSErrTypeFPGACommunication.xml create mode 100755 Common/Errors/MetrologyErrors/idl/ACSErrTypeFPGAConnection.xml create mode 100644 Common/Errors/MetrologyErrors/src/Makefile create mode 100755 Common/Errors/MinorServoErrors/idl/MinorServoErrors.xml create mode 100644 Common/Errors/MinorServoErrors/src/Makefile create mode 100644 Common/Errors/ParserErrors/idl/ParserErrors.xml create mode 100644 Common/Errors/ParserErrors/src/Makefile create mode 100755 Common/Errors/ReceiversErrors/idl/DerotatorErrors.xml create mode 100755 Common/Errors/ReceiversErrors/idl/ReceiversErrors.xml create mode 100644 Common/Errors/ReceiversErrors/src/Makefile create mode 100644 Common/Errors/XBackendErrors/.cproject create mode 100644 Common/Errors/XBackendErrors/.project create mode 100644 Common/Errors/XBackendErrors/idl/XBackendsErrors.xml create mode 100644 Common/Errors/XBackendErrors/src/.idl-compilation-end create mode 100644 Common/Errors/XBackendErrors/src/.idl-compilation-start create mode 100644 Common/Errors/XBackendErrors/src/Makefile create mode 100644 Common/Errors/dummy.txt create mode 100644 Common/Errors/errortypes.txt create mode 100644 Common/Interfaces/ActiveSurfaceInterface/config/CDB/schemas/ActiveSurface.xsd create mode 100644 Common/Interfaces/ActiveSurfaceInterface/idl/ActiveSurfaceBoss.idl create mode 100644 Common/Interfaces/ActiveSurfaceInterface/src/Makefile create mode 100644 Common/Interfaces/AntennaInterface/config/CDB/schemas/Mount.xsd create mode 100644 Common/Interfaces/AntennaInterface/config/CDB/schemas/PointingModel.xsd create mode 100644 Common/Interfaces/AntennaInterface/config/CDB/schemas/Station.xsd create mode 100644 Common/Interfaces/AntennaInterface/config/doxyfile create mode 100644 Common/Interfaces/AntennaInterface/idl/AntennaBoss.midl create mode 100644 Common/Interfaces/AntennaInterface/idl/EphemGenerator.idl create mode 100644 Common/Interfaces/AntennaInterface/idl/EphemGeneratorMACRO_include.idl create mode 100644 Common/Interfaces/AntennaInterface/idl/Moon.midl create mode 100644 Common/Interfaces/AntennaInterface/idl/Mount.midl create mode 100644 Common/Interfaces/AntennaInterface/idl/OTF.midl create mode 100644 Common/Interfaces/AntennaInterface/idl/Observatory.midl create mode 100644 Common/Interfaces/AntennaInterface/idl/PointingModel.idl create mode 100644 Common/Interfaces/AntennaInterface/idl/Refraction.idl create mode 100644 Common/Interfaces/AntennaInterface/idl/SkySource.midl create mode 100644 Common/Interfaces/AntennaInterface/images/Antenna.png create mode 100644 Common/Interfaces/AntennaInterface/src/Antenna.xmi create mode 100644 Common/Interfaces/AntennaInterface/src/Makefile create mode 100644 Common/Interfaces/BackendsInterface/config/CDB/schemas/DigitalXCorrelator.xsd create mode 100644 Common/Interfaces/BackendsInterface/config/CDB/schemas/GenericBackend.xsd create mode 100755 Common/Interfaces/BackendsInterface/config/CDB/schemas/Holography.xsd create mode 100644 Common/Interfaces/BackendsInterface/config/doxyfile create mode 100644 Common/Interfaces/BackendsInterface/idl/BackendsBoss.idl create mode 100644 Common/Interfaces/BackendsInterface/idl/DBBC.idl create mode 100644 Common/Interfaces/BackendsInterface/idl/DFBInterface.idl create mode 100644 Common/Interfaces/BackendsInterface/idl/DigitalXCorrelator.idl create mode 100644 Common/Interfaces/BackendsInterface/idl/GenericBackend.idl create mode 100755 Common/Interfaces/BackendsInterface/idl/Holography.idl create mode 100644 Common/Interfaces/BackendsInterface/idl/NoiseGenerator.idl create mode 100644 Common/Interfaces/BackendsInterface/idl/Roach.idl create mode 100644 Common/Interfaces/BackendsInterface/idl/TotalPower.idl create mode 100644 Common/Interfaces/BackendsInterface/images/Backends.png create mode 100644 Common/Interfaces/BackendsInterface/src/Makefile create mode 100644 Common/Interfaces/CommonInterface/config/CDB/schemas/Antenna.xsd create mode 100644 Common/Interfaces/CommonInterface/config/CDB/schemas/Managment.xsd create mode 100644 Common/Interfaces/CommonInterface/config/CDB/schemas/Receivers.xsd create mode 100644 Common/Interfaces/CommonInterface/config/doxyfile create mode 100644 Common/Interfaces/CommonInterface/idl/AntennaDefinitions.midl create mode 100644 Common/Interfaces/CommonInterface/idl/BackendsDefinitions.midl create mode 100644 Common/Interfaces/CommonInterface/idl/ManagmentDefinitions.midl create mode 100644 Common/Interfaces/CommonInterface/idl/MinorServoDefinitions.midl create mode 100644 Common/Interfaces/CommonInterface/idl/ReceiversDefinitions.midl create mode 100644 Common/Interfaces/CommonInterface/include/AntennaModule.h create mode 100644 Common/Interfaces/CommonInterface/include/ManagementModule.h create mode 100644 Common/Interfaces/CommonInterface/include/ReceiversModule.h create mode 100644 Common/Interfaces/CommonInterface/src/Makefile create mode 100644 Common/Interfaces/CommonInterface/src/ManagementModule.cpp create mode 100644 Common/Interfaces/CommonInterface/src/ReceiversModule.cpp create mode 100644 Common/Interfaces/Makefile create mode 100644 Common/Interfaces/ManagmentInterface/config/CDB/schemas/ProcedureFile.xsd create mode 100644 Common/Interfaces/ManagmentInterface/config/CDB/schemas/TelescopeEquipment.xsd create mode 100644 Common/Interfaces/ManagmentInterface/config/doxyfile create mode 100644 Common/Interfaces/ManagmentInterface/idl/CalibrationTool.idl create mode 100644 Common/Interfaces/ManagmentInterface/idl/CustomLogger.midl create mode 100644 Common/Interfaces/ManagmentInterface/idl/DataReceiver.idl create mode 100644 Common/Interfaces/ManagmentInterface/idl/ExternalClients.idl create mode 100644 Common/Interfaces/ManagmentInterface/idl/FitsWriter.idl create mode 100644 Common/Interfaces/ManagmentInterface/idl/MBFitsWriter.idl create mode 100644 Common/Interfaces/ManagmentInterface/idl/Scheduler.idl create mode 100644 Common/Interfaces/ManagmentInterface/src/Makefile create mode 100644 Common/Interfaces/MinorServoInterface/idl/MinorServo.idl create mode 100644 Common/Interfaces/MinorServoInterface/idl/MinorServoBoss.idl create mode 100644 Common/Interfaces/MinorServoInterface/src/Makefile create mode 100644 Common/Interfaces/MinorServoInterface/test/Makefile create mode 100644 Common/Interfaces/MinorServoInterface/test/PyMinorServoTest/__init__.py create mode 100644 Common/Interfaces/MinorServoInterface/test/PyMinorServoTest/simunittest.py create mode 100644 Common/Interfaces/MinorServoInterface/test/external/__init__.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/__init__.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/commands/__init__.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/commands/test_servoSetup.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/commands/test_setServoASConfiguration.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/commands/test_setServoElevationTracking.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/commands/test_setServoOffset.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/test_clearUserOffset.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/test_getAxesInfo.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/test_getAxesPosition.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/test_getCentralScanPosition.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/test_position.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/test_scan.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/test_setASConfiguration.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/test_setElevationTracking.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/test_systemOffset.py create mode 100644 Common/Interfaces/MinorServoInterface/test/functional/test_userOffset.py create mode 100644 Common/Interfaces/MinorServoInterface/test/pyunit/__init__.py create mode 100644 Common/Interfaces/MinorServoInterface/test/unittest.cpp create mode 100644 Common/Interfaces/ReceiversInterface/config/CDB/schemas/DewarPositionerActions.xsd create mode 100644 Common/Interfaces/ReceiversInterface/config/CDB/schemas/DewarPositionerMapping.xsd create mode 100644 Common/Interfaces/ReceiversInterface/config/CDB/schemas/DewarPositionerUpdatingTable.xsd create mode 100644 Common/Interfaces/ReceiversInterface/config/CDB/schemas/Feeds.xsd create mode 100644 Common/Interfaces/ReceiversInterface/config/CDB/schemas/LocalOscillator.xsd create mode 100644 Common/Interfaces/ReceiversInterface/config/CDB/schemas/LocalOscillatorEthernet.xsd create mode 100644 Common/Interfaces/ReceiversInterface/config/CDB/schemas/LocalOscillatorLookUpTable.xsd create mode 100644 Common/Interfaces/ReceiversInterface/config/CDB/schemas/NoiseMarkLookUpTable.xsd create mode 100644 Common/Interfaces/ReceiversInterface/config/CDB/schemas/ReceiversModeSetup.xsd create mode 100644 Common/Interfaces/ReceiversInterface/config/CDB/schemas/TaperLookUpTable.xsd create mode 100644 Common/Interfaces/ReceiversInterface/config/doxyfile create mode 100644 Common/Interfaces/ReceiversInterface/idl/CommonReceiverInterface.idl create mode 100644 Common/Interfaces/ReceiversInterface/idl/DewarPositioner.idl create mode 100644 Common/Interfaces/ReceiversInterface/idl/DewarPositionerDefinitions.midl create mode 100644 Common/Interfaces/ReceiversInterface/idl/GenericDerotator.idl create mode 100644 Common/Interfaces/ReceiversInterface/idl/GenericReceiver.idl create mode 100644 Common/Interfaces/ReceiversInterface/idl/LocalOscillatorInterface.idl create mode 100644 Common/Interfaces/ReceiversInterface/idl/ReceiversBoss.idl create mode 100644 Common/Interfaces/ReceiversInterface/src/Makefile create mode 100644 Common/Interfaces/WeatherStationInterface/idl/GenericWeatherStation.idl create mode 100644 Common/Interfaces/WeatherStationInterface/idl/MeteoData.idl create mode 100644 Common/Interfaces/WeatherStationInterface/src/Makefile create mode 100644 Common/Interfaces/XBackendInterface/.cproject create mode 100644 Common/Interfaces/XBackendInterface/.project create mode 100644 Common/Interfaces/XBackendInterface/idl/XBackends.midl create mode 100644 Common/Interfaces/XBackendInterface/src/Makefile create mode 100644 Common/Interfaces/dummy.txt create mode 100644 Common/Libraries/ComponentProxy/include/ActiveSurfaceProxy.h create mode 100644 Common/Libraries/ComponentProxy/include/AntennaProxy.h create mode 100644 Common/Libraries/ComponentProxy/include/BackendsProxy.h create mode 100644 Common/Libraries/ComponentProxy/include/ComponentProxies create mode 100644 Common/Libraries/ComponentProxy/include/ComponentProxy.h create mode 100644 Common/Libraries/ComponentProxy/include/ManagementProxy.h create mode 100644 Common/Libraries/ComponentProxy/include/MinorServoProxy.h create mode 100644 Common/Libraries/ComponentProxy/include/MountProxy.h create mode 100644 Common/Libraries/ComponentProxy/include/ReceiversProxy.h create mode 100644 Common/Libraries/ComponentProxy/include/WeatherProxy.h create mode 100644 Common/Libraries/ComponentProxy/src/Makefile create mode 100644 Common/Libraries/ComponentProxy/src/compilation_test.cpp create mode 100644 Common/Libraries/DiscosBackendProtocol/include/DiscosBackendProtocol create mode 100644 Common/Libraries/DiscosBackendProtocol/include/command.hpp create mode 100644 Common/Libraries/DiscosBackendProtocol/include/protocol.hpp create mode 100644 Common/Libraries/DiscosBackendProtocol/src/Makefile create mode 100644 Common/Libraries/DiscosBackendProtocol/src/command.cpp create mode 100644 Common/Libraries/DiscosBackendProtocol/src/protocol.cpp create mode 100644 Common/Libraries/DiscosBackendProtocol/tests/.discos create mode 100644 Common/Libraries/DiscosBackendProtocol/tests/Makefile create mode 100644 Common/Libraries/DiscosBackendProtocol/tests/external/__init__.py create mode 100644 Common/Libraries/DiscosBackendProtocol/tests/functional/__init__.py create mode 100644 Common/Libraries/DiscosBackendProtocol/tests/pyunit/__init__.py create mode 100644 Common/Libraries/DiscosBackendProtocol/tests/unittest.cpp create mode 100644 Common/Libraries/IRALibrary/doc/receiver_lib/receiver_library.pdf create mode 100644 Common/Libraries/IRALibrary/include/CustomLoggerUtils.h create mode 100644 Common/Libraries/IRALibrary/include/DBTable.h create mode 100644 Common/Libraries/IRALibrary/include/DataField.h create mode 100644 Common/Libraries/IRALibrary/include/DateTime.h create mode 100644 Common/Libraries/IRALibrary/include/Definitions.h create mode 100644 Common/Libraries/IRALibrary/include/Error.h create mode 100644 Common/Libraries/IRALibrary/include/FastQueue.h create mode 100644 Common/Libraries/IRALibrary/include/FrequencyTracking.h create mode 100644 Common/Libraries/IRALibrary/include/IRA create mode 100644 Common/Libraries/IRALibrary/include/IRATools.h create mode 100644 Common/Libraries/IRALibrary/include/Lecom.h create mode 100644 Common/Libraries/IRALibrary/include/LogDike.h create mode 100644 Common/Libraries/IRALibrary/include/LogFilter.h create mode 100644 Common/Libraries/IRALibrary/include/MicroControllerBoard.h create mode 100644 Common/Libraries/IRALibrary/include/MicroControllerBoardDef.h create mode 100644 Common/Libraries/IRALibrary/include/ReceiverControl.h create mode 100644 Common/Libraries/IRALibrary/include/ScheduleTimer.h create mode 100644 Common/Libraries/IRALibrary/include/SecureArea.h create mode 100644 Common/Libraries/IRALibrary/include/SerialPort.h create mode 100644 Common/Libraries/IRALibrary/include/Site.h create mode 100644 Common/Libraries/IRALibrary/include/SkySource.h create mode 100644 Common/Libraries/IRALibrary/include/Socket.h create mode 100644 Common/Libraries/IRALibrary/include/SourceFlux.h create mode 100644 Common/Libraries/IRALibrary/include/String.h create mode 100644 Common/Libraries/IRALibrary/include/TimeTaggedCircularArray.h create mode 100644 Common/Libraries/IRALibrary/include/TimeoutSync.h create mode 100644 Common/Libraries/IRALibrary/include/Timer.h create mode 100644 Common/Libraries/IRALibrary/src/CustomLoggerUtils.cpp create mode 100644 Common/Libraries/IRALibrary/src/DBTable.cpp create mode 100644 Common/Libraries/IRALibrary/src/DataField.cpp create mode 100644 Common/Libraries/IRALibrary/src/DateTime.cpp create mode 100644 Common/Libraries/IRALibrary/src/Error.cpp create mode 100644 Common/Libraries/IRALibrary/src/FrequencyTracking.cpp create mode 100644 Common/Libraries/IRALibrary/src/IRAPy/__init__.py create mode 100644 Common/Libraries/IRALibrary/src/IRAPy/bsqueue.py create mode 100644 Common/Libraries/IRALibrary/src/IRAPy/customlogging.py create mode 100644 Common/Libraries/IRALibrary/src/IRATools.cpp create mode 100644 Common/Libraries/IRALibrary/src/Lecom.cpp create mode 100644 Common/Libraries/IRALibrary/src/LogDike.cpp create mode 100644 Common/Libraries/IRALibrary/src/LogFilter.cpp create mode 100644 Common/Libraries/IRALibrary/src/Makefile create mode 100644 Common/Libraries/IRALibrary/src/MicroControllerBoard.cpp create mode 100644 Common/Libraries/IRALibrary/src/ReceiverControl.cpp create mode 100644 Common/Libraries/IRALibrary/src/ScheduleTimer.cpp create mode 100644 Common/Libraries/IRALibrary/src/SerialPort.cpp create mode 100644 Common/Libraries/IRALibrary/src/Site.cpp create mode 100644 Common/Libraries/IRALibrary/src/SkySource.cpp create mode 100644 Common/Libraries/IRALibrary/src/Socket.cpp create mode 100644 Common/Libraries/IRALibrary/src/SourceFlux.cpp create mode 100644 Common/Libraries/IRALibrary/src/String.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestDBTable.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestDike.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestFloatRounding.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestFrequency.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestMicroControllerBoard.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestReceiverControl.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestScheduleTimer.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestSiderealToUTC.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestSkySource.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestSourceFlux.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestTTCArray.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestTimer.cpp create mode 100644 Common/Libraries/IRALibrary/src/TestTypeConversion.cpp create mode 100644 Common/Libraries/IRALibrary/src/TimeTaggedCircularArray.cpp create mode 100644 Common/Libraries/IRALibrary/src/TimeoutSync.cpp create mode 100644 Common/Libraries/IRALibrary/src/Timer.cpp create mode 100644 Common/Libraries/IRALibrary/tests/.discos create mode 100644 Common/Libraries/IRALibrary/tests/FastQueue_test.i create mode 100644 Common/Libraries/IRALibrary/tests/IRATools_test.i create mode 100644 Common/Libraries/IRALibrary/tests/Makefile create mode 100644 Common/Libraries/IRALibrary/tests/external/__init__.py create mode 100644 Common/Libraries/IRALibrary/tests/functional/__init__.py create mode 100644 Common/Libraries/IRALibrary/tests/pyunit/__init__.py create mode 100644 Common/Libraries/IRALibrary/tests/unittest.cpp create mode 100644 Common/Libraries/Makefile create mode 100755 Common/Libraries/ModbusChannel/include/ModbusChannel.h create mode 100644 Common/Libraries/ModbusChannel/src/Makefile create mode 100755 Common/Libraries/ModbusChannel/src/ModbusChannel.cpp create mode 100644 Common/Libraries/ParserLibrary/include/SP_function0.h create mode 100644 Common/Libraries/ParserLibrary/include/SP_function1.h create mode 100644 Common/Libraries/ParserLibrary/include/SP_function2.h create mode 100644 Common/Libraries/ParserLibrary/include/SP_function3.h create mode 100644 Common/Libraries/ParserLibrary/include/SP_function4.h create mode 100644 Common/Libraries/ParserLibrary/include/SP_function5.h create mode 100644 Common/Libraries/ParserLibrary/include/SP_function6.h create mode 100644 Common/Libraries/ParserLibrary/include/SP_function7.h create mode 100644 Common/Libraries/ParserLibrary/include/SP_functor.h create mode 100644 Common/Libraries/ParserLibrary/include/SP_parser.h create mode 100644 Common/Libraries/ParserLibrary/include/SP_parser.i create mode 100644 Common/Libraries/ParserLibrary/include/SP_typeConversion.h create mode 100644 Common/Libraries/ParserLibrary/include/SP_types.h create mode 100644 Common/Libraries/ParserLibrary/src/Makefile create mode 100644 Common/Libraries/ParserLibrary/src/TestFunctions.cpp create mode 100644 Common/Libraries/ParserLibrary/src/TestParser.cpp create mode 100644 Common/Libraries/ParserLibrary/src/TestTypes.cpp create mode 100644 Common/Libraries/ParserLibrary/tests/.discos create mode 100644 Common/Libraries/ParserLibrary/tests/Makefile create mode 100644 Common/Libraries/ParserLibrary/tests/external/__init__.py create mode 100644 Common/Libraries/ParserLibrary/tests/functional/__init__.py create mode 100644 Common/Libraries/ParserLibrary/tests/gtest/procedures.cpp create mode 100644 Common/Libraries/ParserLibrary/tests/procedure.cfg create mode 100644 Common/Libraries/ParserLibrary/tests/pyunit/__init__.py create mode 100644 Common/Libraries/ParserLibrary/tests/results/cppunittest.xml create mode 100644 Common/Libraries/ParserLibrary/tests/unittest.cpp create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_box.cpp create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_box.h create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_boxscope.cpp create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_boxscope.h create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_curve.cpp create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_curve.h create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_datapoint.cpp create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_datapoint.h create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_graphics.pro create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_graphics.pro.README.txt create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_histogram.cpp create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_histogram.h create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_image.cpp create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_image.h create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_label.cpp create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_label.h create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_monitor.cpp create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_monitor.h create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_plotter.cpp create mode 100644 Common/Libraries/QtGraphicsLibrary/IRA_plotter.h create mode 100644 Common/Libraries/QtGraphicsLibrary/Makefile create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_Callbacks.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_Callbacks.i create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_Frame.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_FrameComponent.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_InputCommand.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_Label.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_LedDisplay.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_PropertyBitField.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_PropertyBitField.i create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_PropertyComponent.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_PropertyComponent.i create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_PropertyLedDisplay.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_PropertyLedDisplay.i create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_PropertyStatusBox.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_PropertyStatusBox.i create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_PropertyText.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_PropertyText.i create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_StatusBox.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_StatusBox.i create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_Text.h create mode 100644 Common/Libraries/TextWindowLibrary/include/TW_Tools.h create mode 100644 Common/Libraries/TextWindowLibrary/src/Callbacks.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/Frame.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/FrameComponent.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/InputCommand.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/Label.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/LedDisplay.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/Makefile create mode 100644 Common/Libraries/TextWindowLibrary/src/PropertyBitField.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/PropertyComponent.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/PropertyLedDisplay.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/PropertyStatusBox.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/PropertyText.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/StatusBox.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/Text.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/Tools.cpp create mode 100644 Common/Libraries/TextWindowLibrary/src/getTextClientTemplate create mode 100644 Common/Libraries/TextWindowLibrary/templates/Client.cpp.template create mode 100644 Common/Libraries/TextWindowLibrary/templates/Client.h.template create mode 100644 Common/Libraries/XarcosLibrary/.cproject create mode 100644 Common/Libraries/XarcosLibrary/.project create mode 100644 Common/Libraries/XarcosLibrary/.settings/org.eclipse.core.resources.prefs create mode 100644 Common/Libraries/XarcosLibrary/include/AdcConditioner.h create mode 100644 Common/Libraries/XarcosLibrary/include/BbcFilter.h create mode 100644 Common/Libraries/XarcosLibrary/include/Configuration.h create mode 100644 Common/Libraries/XarcosLibrary/include/Cpld2Intf.h create mode 100644 Common/Libraries/XarcosLibrary/include/Cpld2IntfClient.h create mode 100644 Common/Libraries/XarcosLibrary/include/Data.h create mode 100644 Common/Libraries/XarcosLibrary/include/DataIntegrazione.h create mode 100644 Common/Libraries/XarcosLibrary/include/GroupSpectrometer.h create mode 100644 Common/Libraries/XarcosLibrary/include/HardwareBlock.h create mode 100644 Common/Libraries/XarcosLibrary/include/SingleSpectrometer.h create mode 100644 Common/Libraries/XarcosLibrary/include/SocketClient.h create mode 100644 Common/Libraries/XarcosLibrary/include/SocketConnection.h create mode 100644 Common/Libraries/XarcosLibrary/include/SocketServer.h create mode 100644 Common/Libraries/XarcosLibrary/include/Specifiche.h create mode 100644 Common/Libraries/XarcosLibrary/include/Spectrometer.h create mode 100644 Common/Libraries/XarcosLibrary/include/XaMutex.h create mode 100644 Common/Libraries/XarcosLibrary/include/XaSemaphore.h create mode 100644 Common/Libraries/XarcosLibrary/include/XaThread.h create mode 100644 Common/Libraries/XarcosLibrary/include/headResult.h create mode 100644 Common/Libraries/XarcosLibrary/src/AdcConditioner.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/BbcFilter.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/Cpld2Intf.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/Cpld2IntfClient.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/Data.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/DataIntegrazione.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/GroupSpectrometer.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/HardwareBlock.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/Makefile create mode 100644 Common/Libraries/XarcosLibrary/src/SingleSpectrometer.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/SocketClient.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/SocketConnection.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/SocketServer.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/Specifiche.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/Spectrometer.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/XaMutex.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/XaSemaphore.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/XaThread.cpp create mode 100644 Common/Libraries/XarcosLibrary/src/headResult.cpp create mode 100644 Common/Libraries/dummy.txt create mode 100644 Common/Misc/InjectCommand/src/Makefile create mode 100644 Common/Misc/InjectCommand/src/injectCommand.py create mode 100644 Common/Misc/KStars/app-defaults/Calibrators.ksc create mode 100644 Common/Misc/KStars/app-defaults/Kband.ksc create mode 100644 Common/Misc/KStars/doc/README.txt create mode 100644 Common/Misc/KStars/doc/kstars-patch.html create mode 100644 Common/Misc/KStars/src/Makefile create mode 100644 Common/Misc/KStars/src/startKS.py create mode 100644 Common/Misc/Makefile create mode 100755 Common/Misc/OnOffSwitching/config.py create mode 100755 Common/Misc/OnOffSwitching/devices.py create mode 100755 Common/Misc/OnOffSwitching/handler.py create mode 100755 Common/Misc/OnOffSwitching/horizons/example.txt create mode 100755 Common/Misc/OnOffSwitching/models.py create mode 100755 Common/Misc/OnOffSwitching/onoff_switching.py create mode 100755 Common/Misc/OnOffSwitching/test_config.py create mode 100755 Common/Misc/OnOffSwitching/utils/test_tracking.py create mode 100644 Common/Misc/Plotter/src/Makefile create mode 100644 Common/Misc/Plotter/src/install.txt create mode 100644 Common/Misc/Plotter/src/plotter.py create mode 100644 Common/Misc/RScanSched/include/RScanSched.h create mode 100644 Common/Misc/RScanSched/src/Makefile create mode 100644 Common/Misc/RScanSched/src/RScanSched.cpp create mode 100644 Common/Misc/Scripts/src/Makefile create mode 100755 Common/Misc/Scripts/src/data_stats create mode 100755 Common/Misc/Scripts/src/tabbify create mode 100644 Common/Misc/getTemplateForTests/src/Makefile create mode 100644 Common/Misc/getTemplateForTests/src/getTemplateForTests create mode 100644 Common/Misc/getTemplateForTests/src/gettemplatefortests.py create mode 100644 Common/Misc/getTemplateForTests/templates/tests/.discos create mode 100644 Common/Misc/getTemplateForTests/templates/tests/Makefile create mode 100644 Common/Misc/getTemplateForTests/templates/tests/external/__init__.py create mode 100644 Common/Misc/getTemplateForTests/templates/tests/functional/__init__.py create mode 100644 Common/Misc/getTemplateForTests/templates/tests/pyunit/__init__.py create mode 100644 Common/Misc/getTemplateForTests/templates/tests/unittest.cpp create mode 100644 Common/Misc/getTemplateForTests/tests/Makefile create mode 100644 Common/Misc/getTemplateForTests/tests/external/__init__.py create mode 100644 Common/Misc/getTemplateForTests/tests/functional/__init__.py create mode 100644 Common/Misc/getTemplateForTests/tests/functional/test_no_svn.py create mode 100644 Common/Misc/getTemplateForTests/tests/pyunit/__init__.py create mode 100644 Common/Misc/getTemplateForTests/tests/unittest.cpp create mode 100644 Common/Servers/AntennaBoss/config/CDB/schemas/AntennaBoss.xsd create mode 100644 Common/Servers/AntennaBoss/include/AntennaBossImpl.h create mode 100644 Common/Servers/AntennaBoss/include/BossCore.h create mode 100644 Common/Servers/AntennaBoss/include/Callback.h create mode 100644 Common/Servers/AntennaBoss/include/Configuration.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOCorrectionOffsets.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOEnable.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOGeneratorType.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOHPBW.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOLambda.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOObservedEquatorial.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOObservedGalactic.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOObservedHorizontal.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOOffsets.h create mode 100644 Common/Servers/AntennaBoss/include/DevIORawHorizontal.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOStatus.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOTargetCoordinate.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOTargetName.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOVradDefinition.h create mode 100644 Common/Servers/AntennaBoss/include/DevIOVradReferenceFrame.h create mode 100644 Common/Servers/AntennaBoss/include/Offset.h create mode 100644 Common/Servers/AntennaBoss/include/SlewCheck.h create mode 100644 Common/Servers/AntennaBoss/include/TestClient.h create mode 100644 Common/Servers/AntennaBoss/include/WatchingThread.h create mode 100644 Common/Servers/AntennaBoss/include/WorkingThread.h create mode 100644 Common/Servers/AntennaBoss/src/AntennaBossImpl.cpp create mode 100644 Common/Servers/AntennaBoss/src/BossCore.cpp create mode 100644 Common/Servers/AntennaBoss/src/BossCore_extra.i create mode 100644 Common/Servers/AntennaBoss/src/BossCore_prepareScan.i create mode 100644 Common/Servers/AntennaBoss/src/BossCore_startScan.i create mode 100644 Common/Servers/AntennaBoss/src/BossCore_startScanWrappers.i create mode 100644 Common/Servers/AntennaBoss/src/Callback.cpp create mode 100644 Common/Servers/AntennaBoss/src/Configuration.cpp create mode 100644 Common/Servers/AntennaBoss/src/Makefile create mode 100644 Common/Servers/AntennaBoss/src/Offset.cpp create mode 100644 Common/Servers/AntennaBoss/src/SlewCheck.cpp create mode 100644 Common/Servers/AntennaBoss/src/TestClient.cpp create mode 100644 Common/Servers/AntennaBoss/src/WatchingThread.cpp create mode 100644 Common/Servers/AntennaBoss/src/WorkingThread.cpp create mode 100644 Common/Servers/AntennaBoss/src/coordinateGrabber.cpp create mode 100644 Common/Servers/AntennaBoss/tests/.discos create mode 100644 Common/Servers/AntennaBoss/tests/Makefile create mode 100644 Common/Servers/AntennaBoss/tests/Offset_test.i create mode 100644 Common/Servers/AntennaBoss/tests/external/__init__.py create mode 100644 Common/Servers/AntennaBoss/tests/functional/__init__.py create mode 100644 Common/Servers/AntennaBoss/tests/pyunit/__init__.py create mode 100644 Common/Servers/AntennaBoss/tests/unittest.cpp create mode 100644 Common/Servers/CalibrationTool/config/CDB/schemas/CalibrationTool.xsd create mode 100644 Common/Servers/CalibrationTool/include/CalibrationToolImpl.h create mode 100644 Common/Servers/CalibrationTool/include/CollectorThread.h create mode 100644 Common/Servers/CalibrationTool/include/CommonTools.h create mode 100644 Common/Servers/CalibrationTool/include/Configuration.h create mode 100644 Common/Servers/CalibrationTool/include/DataCollection.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOAmplitude.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOArrayDataX.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOArrayDataY.h create mode 100644 Common/Servers/CalibrationTool/include/DevIODataX.h create mode 100644 Common/Servers/CalibrationTool/include/DevIODataY.h create mode 100644 Common/Servers/CalibrationTool/include/DevIODeviceID.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOFileName.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOHPBW.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOObserver.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOOffset.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOPeakOffset.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOProjectName.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOScanAxis.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOScanIdentifier.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOSlope.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOSourceFlux.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOSourceName.h create mode 100644 Common/Servers/CalibrationTool/include/DevIOStatus.h create mode 100644 Common/Servers/CalibrationTool/include/EngineThread.h create mode 100644 Common/Servers/CalibrationTool/include/ReceiverCallback.h create mode 100644 Common/Servers/CalibrationTool/include/fgaus.h create mode 100644 Common/Servers/CalibrationTool/include/fit2.h create mode 100644 Common/Servers/CalibrationTool/include/matin.h create mode 100644 Common/Servers/CalibrationTool/src/CalibrationToolImpl.cpp create mode 100644 Common/Servers/CalibrationTool/src/CollectorThread.cpp create mode 100644 Common/Servers/CalibrationTool/src/CommonTools.cpp create mode 100644 Common/Servers/CalibrationTool/src/Configuration.cpp create mode 100644 Common/Servers/CalibrationTool/src/DataCollection.cpp create mode 100644 Common/Servers/CalibrationTool/src/EngineThread.cpp create mode 100644 Common/Servers/CalibrationTool/src/EngineThread4CTsimulator.cpp create mode 100644 Common/Servers/CalibrationTool/src/Makefile create mode 100644 Common/Servers/CalibrationTool/src/ReceiverCallback.cpp create mode 100644 Common/Servers/CalibrationTool/src/TestWriter.cpp create mode 100644 Common/Servers/CalibrationTool/src/fgaus.c create mode 100644 Common/Servers/CalibrationTool/src/fgaus.f create mode 100644 Common/Servers/CalibrationTool/src/fit2.c create mode 100644 Common/Servers/CalibrationTool/src/fit2.f create mode 100644 Common/Servers/CalibrationTool/src/matin.c create mode 100644 Common/Servers/CalibrationTool/src/matin.f create mode 100644 Common/Servers/CalibrationTool/src/testBulkTransmission.cpp create mode 100644 Common/Servers/CustomLogger/config/CDB/schemas/CustomLogger.xsd create mode 100644 Common/Servers/CustomLogger/include/CustomLoggerImpl.h create mode 100644 Common/Servers/CustomLogger/include/expat_log_parsing.h create mode 100644 Common/Servers/CustomLogger/src/CustomLoggerImpl.cpp create mode 100644 Common/Servers/CustomLogger/src/Makefile create mode 100644 Common/Servers/CustomLogger/src/expat_log_parsing.cpp create mode 100755 Common/Servers/CustomLogger/test/log_bomber create mode 100755 Common/Servers/CustomLogger/test/log_continuous create mode 100755 Common/Servers/CustomLogger/test/log_malformed create mode 100644 Common/Servers/CustomLogger/test/logrotate.script create mode 100644 Common/Servers/CustomLogger/tests/.discos create mode 100644 Common/Servers/CustomLogger/tests/Makefile create mode 100644 Common/Servers/CustomLogger/tests/external/__init__.py create mode 100644 Common/Servers/CustomLogger/tests/functional/__init__.py create mode 100755 Common/Servers/CustomLogger/tests/functional/logging_process.py create mode 100644 Common/Servers/CustomLogger/tests/functional/test_logging.py create mode 100644 Common/Servers/CustomLogger/tests/pyunit/__init__.py create mode 100644 Common/Servers/CustomLogger/tests/unittest.cpp create mode 100644 Common/Servers/DBBC/config/CDB/schemas/DBBC.xsd create mode 100755 Common/Servers/DBBC/include/Common.h create mode 100755 Common/Servers/DBBC/include/Cpld2Intf.h create mode 100755 Common/Servers/DBBC/include/Cpld2IntfClient.h create mode 100644 Common/Servers/DBBC/include/DBBCImpl.h create mode 100755 Common/Servers/DBBC/include/SocketClient.h create mode 100755 Common/Servers/DBBC/include/SocketConnection.h create mode 100755 Common/Servers/DBBC/src/Cpld2Intf.cpp create mode 100755 Common/Servers/DBBC/src/Cpld2IntfClient.cpp create mode 100644 Common/Servers/DBBC/src/DBBCImpl.cpp create mode 100644 Common/Servers/DBBC/src/Makefile create mode 100755 Common/Servers/DBBC/src/SocketClient.cpp create mode 100755 Common/Servers/DBBC/src/SocketConnection.cpp create mode 100644 Common/Servers/ExternalClients/config/CDB/schemas/ExternalClients.xsd create mode 100644 Common/Servers/ExternalClients/config/CDB/schemas/RFIMonitoring.xsd create mode 100644 Common/Servers/ExternalClients/doc/ComandiNURAGHE.doc create mode 100644 Common/Servers/ExternalClients/include/Configuration.h create mode 100644 Common/Servers/ExternalClients/include/DevIOStatus.h create mode 100644 Common/Servers/ExternalClients/include/ExternalClientsImpl.h create mode 100644 Common/Servers/ExternalClients/include/ExternalClientsSocketServer.h create mode 100644 Common/Servers/ExternalClients/include/ExternalClientsThread.h create mode 100644 Common/Servers/ExternalClients/src/Configuration.cpp create mode 100644 Common/Servers/ExternalClients/src/ExternalClientsImpl.cpp create mode 100644 Common/Servers/ExternalClients/src/ExternalClientsSocketServer.cpp create mode 100644 Common/Servers/ExternalClients/src/ExternalClientsThread.cpp create mode 100644 Common/Servers/ExternalClients/src/Makefile create mode 100644 Common/Servers/ExternalClients/test/Makefile create mode 100644 Common/Servers/ExternalClients/test/external/__init__.py create mode 100644 Common/Servers/ExternalClients/test/functional/__init__.py create mode 100755 Common/Servers/ExternalClients/test/functional/test_extclient.py create mode 100644 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/ClientSocket.cpp create mode 100644 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/ClientSocket.h create mode 100644 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/Makefile create mode 100644 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/ServerSocket.cpp create mode 100644 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/ServerSocket.h create mode 100644 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/Socket.cpp create mode 100644 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/Socket.h create mode 100644 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/SocketException.h create mode 100755 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/simple_client create mode 100644 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/simple_client_main.cpp create mode 100755 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/simple_server create mode 100644 Common/Servers/ExternalClients/test/no_auto/LinuxSocket/simple_server_main.cpp create mode 100644 Common/Servers/ExternalClients/test/pyunit/__init__.py create mode 100644 Common/Servers/ExternalClients/test/unittest.cpp create mode 100644 Common/Servers/FitsWriter/config/CDB/schemas/FitsWriter.xsd create mode 100644 Common/Servers/FitsWriter/doc/install.readme create mode 100644 Common/Servers/FitsWriter/include/CollectorThread.h create mode 100644 Common/Servers/FitsWriter/include/CommonTools.h create mode 100644 Common/Servers/FitsWriter/include/Configuration.h create mode 100644 Common/Servers/FitsWriter/include/DataCollection.h create mode 100644 Common/Servers/FitsWriter/include/DevIODeviceID.h create mode 100644 Common/Servers/FitsWriter/include/DevIOFileName.h create mode 100644 Common/Servers/FitsWriter/include/DevIOObserver.h create mode 100644 Common/Servers/FitsWriter/include/DevIOProjectName.h create mode 100644 Common/Servers/FitsWriter/include/DevIOScanAxis.h create mode 100644 Common/Servers/FitsWriter/include/DevIOStatus.h create mode 100644 Common/Servers/FitsWriter/include/EngineThread.h create mode 100644 Common/Servers/FitsWriter/include/File.h create mode 100644 Common/Servers/FitsWriter/include/FileCreator.h create mode 100644 Common/Servers/FitsWriter/include/FitsTools.h create mode 100644 Common/Servers/FitsWriter/include/FitsWriter.h create mode 100644 Common/Servers/FitsWriter/include/FitsWriterImpl.h create mode 100644 Common/Servers/FitsWriter/include/MetaData.h create mode 100644 Common/Servers/FitsWriter/include/ReceiverCallback.h create mode 100644 Common/Servers/FitsWriter/include/SummarySchema.h create mode 100644 Common/Servers/FitsWriter/include/SummaryWriter.h create mode 100644 Common/Servers/FitsWriter/include/Version.h create mode 100644 Common/Servers/FitsWriter/src/CollectorThread.cpp create mode 100644 Common/Servers/FitsWriter/src/CommonTools.cpp create mode 100644 Common/Servers/FitsWriter/src/Configuration.cpp create mode 100644 Common/Servers/FitsWriter/src/DataCollection.cpp create mode 100644 Common/Servers/FitsWriter/src/EngineThread.cpp create mode 100644 Common/Servers/FitsWriter/src/File.cpp create mode 100644 Common/Servers/FitsWriter/src/FitsTools.cpp create mode 100644 Common/Servers/FitsWriter/src/FitsWriter.cpp create mode 100644 Common/Servers/FitsWriter/src/FitsWriterImpl.cpp create mode 100644 Common/Servers/FitsWriter/src/Makefile create mode 100644 Common/Servers/FitsWriter/src/MetaData.cpp create mode 100644 Common/Servers/FitsWriter/src/ReceiverCallback.cpp create mode 100644 Common/Servers/FitsWriter/src/SummaryWriter.cpp create mode 100644 Common/Servers/FitsWriter/src/TestSummary.cpp create mode 100644 Common/Servers/FitsWriter/src/TestWriter.cpp create mode 100644 Common/Servers/FitsWriter/src/testBulkTransmission.cpp create mode 100644 Common/Servers/HeliumLine/ChangeLog create mode 100644 Common/Servers/HeliumLine/config/CDB/schemas/schema create mode 100644 Common/Servers/HeliumLine/include/CommandLine.h create mode 100644 Common/Servers/HeliumLine/include/DevIOreturnPressure.h create mode 100644 Common/Servers/HeliumLine/include/DevIOsupplyPressure.h create mode 100644 Common/Servers/HeliumLine/include/HeliumLineImpl.h create mode 100644 Common/Servers/HeliumLine/src/CommandLine.cpp create mode 100644 Common/Servers/HeliumLine/src/HeliumLineImpl.cpp create mode 100644 Common/Servers/HeliumLine/src/Makefile create mode 100755 Common/Servers/HeliumLine/src/a.out create mode 100644 Common/Servers/HeliumLine/src/testCommandLine.cpp create mode 100644 Common/Servers/HolographyBackend/include/CommandLine.h create mode 100644 Common/Servers/HolographyBackend/include/Configuration.h create mode 100755 Common/Servers/HolographyBackend/include/DevIODigitalXCorrelator.h create mode 100755 Common/Servers/HolographyBackend/include/HolographyImpl.h create mode 100644 Common/Servers/HolographyBackend/include/SenderThread.h create mode 100644 Common/Servers/HolographyBackend/src/Configuration.cpp create mode 100644 Common/Servers/HolographyBackend/src/DigitalXCorrelatorImpl/DigitalXCorrelator.py create mode 100644 Common/Servers/HolographyBackend/src/DigitalXCorrelatorImpl/__init__.py create mode 100755 Common/Servers/HolographyBackend/src/DigitalXCorrelatorSimImpl/DigitalXCorrelator.py create mode 100755 Common/Servers/HolographyBackend/src/HolographyImpl.cpp create mode 100755 Common/Servers/HolographyBackend/src/Makefile create mode 100644 Common/Servers/HolographyBackend/src/SenderThread.cpp create mode 100644 Common/Servers/HolographyBackend/src/corr2serial.py create mode 100644 Common/Servers/HolographyBackend/src/serial/__init__.py create mode 100644 Common/Servers/HolographyBackend/src/serial/serialcli.py create mode 100644 Common/Servers/HolographyBackend/src/serial/serialjava.py create mode 100644 Common/Servers/HolographyBackend/src/serial/serialposix.py create mode 100644 Common/Servers/HolographyBackend/src/serial/serialutil.py create mode 100644 Common/Servers/HolographyBackend/src/serial/serialwin32.py create mode 100644 Common/Servers/HolographyBackend/src/serial/sermsdos.py create mode 100644 Common/Servers/HolographyBackend/src/serial/win32.py create mode 100644 Common/Servers/LocalOscillator/include/CommandLine.h create mode 100644 Common/Servers/LocalOscillator/include/DevIOamplitude.h create mode 100644 Common/Servers/LocalOscillator/include/DevIOfrequency.h create mode 100644 Common/Servers/LocalOscillator/include/DevIOislocked.h create mode 100644 Common/Servers/LocalOscillator/include/LocalOscillatorImpl.h create mode 100644 Common/Servers/LocalOscillator/src/.idl-compilation-end create mode 100644 Common/Servers/LocalOscillator/src/.idl-compilation-start create mode 100644 Common/Servers/LocalOscillator/src/CommandLine.cpp create mode 100644 Common/Servers/LocalOscillator/src/LocalOscillatorImpl.cpp create mode 100644 Common/Servers/LocalOscillator/src/Makefile create mode 100644 Common/Servers/LocalOscillator/src/testCommandLine.cpp create mode 100644 Common/Servers/MBFitsWriter/DataBlock/AntennaParameters/AntennaParameters.xml create mode 100644 Common/Servers/MBFitsWriter/DataBlock/PointingParameters/PointingParameters.xml create mode 100644 Common/Servers/MBFitsWriter/DataBlock/TimeData/TimeData.xml create mode 100644 Common/Servers/MBFitsWriter/MANAGEMENT/MBFitsWriter.xml create mode 100644 Common/Servers/MBFitsWriter/config/CDB/schemas/AntennaParameters.xsd create mode 100644 Common/Servers/MBFitsWriter/config/CDB/schemas/MBFitsWriter.xsd create mode 100644 Common/Servers/MBFitsWriter/config/CDB/schemas/PointingParameters.xsd create mode 100644 Common/Servers/MBFitsWriter/config/CDB/schemas/TimeData.xsd create mode 100644 Common/Servers/MBFitsWriter/include/Baseband.h create mode 100644 Common/Servers/MBFitsWriter/include/CollectorThread.h create mode 100644 Common/Servers/MBFitsWriter/include/CommonTools.h create mode 100644 Common/Servers/MBFitsWriter/include/Configuration.h create mode 100644 Common/Servers/MBFitsWriter/include/DataCollection.h create mode 100644 Common/Servers/MBFitsWriter/include/DevIOFileName.h create mode 100644 Common/Servers/MBFitsWriter/include/DevIOStatus.h create mode 100644 Common/Servers/MBFitsWriter/include/EngineThread.h create mode 100644 Common/Servers/MBFitsWriter/include/FitsWriter.h create mode 100644 Common/Servers/MBFitsWriter/include/Layout.h create mode 100644 Common/Servers/MBFitsWriter/include/LayoutCollection.h create mode 100644 Common/Servers/MBFitsWriter/include/MBFitsManager.h create mode 100644 Common/Servers/MBFitsWriter/include/MBFitsWriter.h create mode 100644 Common/Servers/MBFitsWriter/include/MBFitsWriterImpl.h create mode 100644 Common/Servers/MBFitsWriter/include/MBFitsWriterTable.h create mode 100644 Common/Servers/MBFitsWriter/include/ReceiverCallback.h create mode 100644 Common/Servers/MBFitsWriter/include/Scan.h create mode 100644 Common/Servers/MBFitsWriter/include/SpectralAxis.h create mode 100644 Common/Servers/MBFitsWriter/src/.idl-compilation-end create mode 100644 Common/Servers/MBFitsWriter/src/.idl-compilation-start create mode 100644 Common/Servers/MBFitsWriter/src/Baseband.cpp create mode 100644 Common/Servers/MBFitsWriter/src/CollectorThread.cpp create mode 100644 Common/Servers/MBFitsWriter/src/CommonTools.cpp create mode 100644 Common/Servers/MBFitsWriter/src/Configuration.cpp create mode 100644 Common/Servers/MBFitsWriter/src/DataCollection.cpp create mode 100644 Common/Servers/MBFitsWriter/src/EngineThread.cpp create mode 100644 Common/Servers/MBFitsWriter/src/FitsWriter.cpp create mode 100644 Common/Servers/MBFitsWriter/src/Layout.cpp create mode 100644 Common/Servers/MBFitsWriter/src/LayoutCollection.cpp create mode 100644 Common/Servers/MBFitsWriter/src/MBFitsManager.cpp create mode 100644 Common/Servers/MBFitsWriter/src/MBFitsWriter.cpp create mode 100644 Common/Servers/MBFitsWriter/src/MBFitsWriterImpl.cpp create mode 100644 Common/Servers/MBFitsWriter/src/MBFitsWriterTable.cpp create mode 100644 Common/Servers/MBFitsWriter/src/Makefile create mode 100644 Common/Servers/MBFitsWriter/src/ReceiverCallback.cpp create mode 100644 Common/Servers/MBFitsWriter/src/Scan.cpp create mode 100644 Common/Servers/MBFitsWriter/src/SpectralAxis.cpp create mode 100644 Common/Servers/MBFitsWriter/src/TestMBFitsWriter.cpp create mode 100644 Common/Servers/Makefile create mode 100644 Common/Servers/Moon/include/MoonImpl.h create mode 100644 Common/Servers/Moon/src/Makefile create mode 100644 Common/Servers/Moon/src/MoonImpl.cpp create mode 100644 Common/Servers/Moon/src/test_moon.cpp create mode 100644 Common/Servers/NewFitsWriter/include/File.h create mode 100644 Common/Servers/NewFitsWriter/include/FileCreator.h create mode 100644 Common/Servers/NewFitsWriter/include/FitsTools.h create mode 100644 Common/Servers/NewFitsWriter/include/FitsWriterImpl.h create mode 100644 Common/Servers/NewFitsWriter/include/ReceiverCallback.h create mode 100644 Common/Servers/NewFitsWriter/include/SubScan.h create mode 100644 Common/Servers/NewFitsWriter/include/SubScanSchema.h create mode 100644 Common/Servers/NewFitsWriter/include/Summary.h create mode 100644 Common/Servers/NewFitsWriter/include/SummarySchema.h create mode 100644 Common/Servers/NewFitsWriter/include/Version.h create mode 100644 Common/Servers/NewFitsWriter/src/File.cpp create mode 100644 Common/Servers/NewFitsWriter/src/FitsTools.cpp create mode 100644 Common/Servers/NewFitsWriter/src/FitsWriterImpl.cpp create mode 100644 Common/Servers/NewFitsWriter/src/Makefile create mode 100644 Common/Servers/NewFitsWriter/src/ReceiverCallback.cpp create mode 100644 Common/Servers/NewFitsWriter/src/SubScan.cpp create mode 100644 Common/Servers/NewFitsWriter/src/Summary.cpp create mode 100644 Common/Servers/NewFitsWriter/tests/File_test.i create mode 100644 Common/Servers/NewFitsWriter/tests/FitsTools_test.i create mode 100644 Common/Servers/NewFitsWriter/tests/Makefile create mode 100644 Common/Servers/NewFitsWriter/tests/TestSchema.h create mode 100644 Common/Servers/NewFitsWriter/tests/TestSchemaCreator.h create mode 100644 Common/Servers/NewFitsWriter/tests/external/__init__.py create mode 100644 Common/Servers/NewFitsWriter/tests/functional/__init__.py create mode 100644 Common/Servers/NewFitsWriter/tests/pyunit/__init__.py create mode 100644 Common/Servers/NewFitsWriter/tests/unittest.cpp create mode 100644 Common/Servers/NoiseGenerator/config/CDB/schemas/NoiseGenerator.xsd create mode 100644 Common/Servers/NoiseGenerator/include/CommandLine.h create mode 100644 Common/Servers/NoiseGenerator/include/Common.h create mode 100644 Common/Servers/NoiseGenerator/include/Configuration.h create mode 100644 Common/Servers/NoiseGenerator/include/ControlThread.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOAttenuation.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOBandWidth.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOBins.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOBusy.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOFeed.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOFrequency.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOInputSection.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOInputsNumber.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOIntegration.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOPolarization.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOSampleRate.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOSectionsNumber.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOStatus.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOTime.h create mode 100644 Common/Servers/NoiseGenerator/include/DevIOTsys.h create mode 100644 Common/Servers/NoiseGenerator/include/NoiseGeneratorImpl.h create mode 100644 Common/Servers/NoiseGenerator/include/Protocol.h create mode 100644 Common/Servers/NoiseGenerator/include/SenderThread.h create mode 100644 Common/Servers/NoiseGenerator/src/CommandLine.cpp create mode 100644 Common/Servers/NoiseGenerator/src/Configuration.cpp create mode 100644 Common/Servers/NoiseGenerator/src/ControlThread.cpp create mode 100644 Common/Servers/NoiseGenerator/src/Makefile create mode 100644 Common/Servers/NoiseGenerator/src/NoiseGeneratorImpl.cpp create mode 100644 Common/Servers/NoiseGenerator/src/Protocol.cpp create mode 100644 Common/Servers/NoiseGenerator/src/SenderThread.cpp create mode 100644 Common/Servers/OTF/include/GreatCircle.h create mode 100644 Common/Servers/OTF/include/OTFImpl.h create mode 100644 Common/Servers/OTF/include/SubScan.h create mode 100644 Common/Servers/OTF/include/TextClient.h create mode 100644 Common/Servers/OTF/src/GreatCircle.cpp create mode 100644 Common/Servers/OTF/src/Makefile create mode 100644 Common/Servers/OTF/src/OTFImpl.cpp create mode 100644 Common/Servers/OTF/src/SubScan.cpp create mode 100644 Common/Servers/OTF/src/TextClient.cpp create mode 100644 Common/Servers/OTF/src/TimeConverter.cpp create mode 100644 Common/Servers/OTF/src/testSubScan.cpp create mode 100644 Common/Servers/Observatory/config/CDB/schemas/Observatory.xsd create mode 100644 Common/Servers/Observatory/include/ObservatoryDevIOs.h create mode 100644 Common/Servers/Observatory/include/ObservatoryImpl.h create mode 100644 Common/Servers/Observatory/src/Makefile create mode 100644 Common/Servers/Observatory/src/ObservatoryImpl.cpp create mode 100644 Common/Servers/PointingModel/ChangeLog create mode 100644 Common/Servers/PointingModel/include/PointingModelImpl.h create mode 100644 Common/Servers/PointingModel/src/Makefile create mode 100644 Common/Servers/PointingModel/src/PointingModelImpl.cpp create mode 100644 Common/Servers/PointingModel/src/TestClient.cpp create mode 100644 Common/Servers/PointingModel/src/getAzOff.cpp create mode 100644 Common/Servers/PointingModel/src/getElOff.cpp create mode 100644 Common/Servers/PyDewarPositioner/TODO.rst create mode 100644 Common/Servers/PyDewarPositioner/config/CDB/schemas/DewarPositioner.xsd create mode 100644 Common/Servers/PyDewarPositioner/doc/README.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/source/api.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/source/conf.py create mode 100755 Common/Servers/PyDewarPositioner/doc/source/configurations.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/source/examples.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/source/images/.~lock.equispaced.odg# create mode 100755 Common/Servers/PyDewarPositioner/doc/source/images/bestspace.png create mode 100755 Common/Servers/PyDewarPositioner/doc/source/images/bestspace.svg create mode 100755 Common/Servers/PyDewarPositioner/doc/source/images/drawing.svg create mode 100755 Common/Servers/PyDewarPositioner/doc/source/images/not_bestspace_gap.png create mode 100755 Common/Servers/PyDewarPositioner/doc/source/images/not_bestspace_overlap.png create mode 100755 Common/Servers/PyDewarPositioner/doc/source/images/not_bestspace_overlap.svg create mode 100755 Common/Servers/PyDewarPositioner/doc/source/index.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/source/park.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/source/rewinding.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/source/setup.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/source/user_commands.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/Makefile create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/api.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/conf.py create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/configurations.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/examples.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/images/.~lock.equispaced.odg# create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/images/bestspace.png create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/images/bestspace.svg create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/images/drawing.svg create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/images/not_bestspace_gap.png create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/images/not_bestspace_overlap.png create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/images/not_bestspace_overlap.svg create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/index.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/park.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/rewinding.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/setup.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/tecnical/source/user_commands.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/user/Makefile create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/api.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/conf.py create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/configurations.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/examples.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/images/.~lock.equispaced.odg# create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/images/bestspace.png create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/images/bestspace.svg create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/images/drawing.svg create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/images/not_bestspace_gap.png create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/images/not_bestspace_overlap.png create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/images/not_bestspace_overlap.svg create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/index.rst create mode 100644 Common/Servers/PyDewarPositioner/doc/user/source/intro.rst create mode 100644 Common/Servers/PyDewarPositioner/doc/user/source/operator_input.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/park.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/rewinding.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/setup.rst create mode 100755 Common/Servers/PyDewarPositioner/doc/user/source/user_commands.rst create mode 100644 Common/Servers/PyDewarPositioner/src/DewarPositioner/DewarPositionerImpl.py create mode 100644 Common/Servers/PyDewarPositioner/src/DewarPositioner/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/src/DewarPositioner/cdbconf.py create mode 100644 Common/Servers/PyDewarPositioner/src/DewarPositioner/devios.py create mode 100644 Common/Servers/PyDewarPositioner/src/DewarPositioner/posgenerator.py create mode 100644 Common/Servers/PyDewarPositioner/src/DewarPositioner/positioner.py create mode 100644 Common/Servers/PyDewarPositioner/src/Makefile create mode 100644 Common/Servers/PyDewarPositioner/src/derotatorPosition.py create mode 100644 Common/Servers/PyDewarPositioner/test/DewarPositionerMockers/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/test/DewarPositionerMockers/mock_components.py create mode 100644 Common/Servers/PyDewarPositioner/test/Makefile create mode 100644 Common/Servers/PyDewarPositioner/test/README.rst create mode 100755 Common/Servers/PyDewarPositioner/test/dependencies/coverage-3.7.1.tar.gz create mode 100755 Common/Servers/PyDewarPositioner/test/dependencies/mocker-1.1.1.tar.bz2 create mode 100755 Common/Servers/PyDewarPositioner/test/dependencies/unittest2-0.5.1.tar.gz create mode 100644 Common/Servers/PyDewarPositioner/test/external/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_command.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorClearAutoRewindingSteps.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorGetCmdPosition.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorGetMaxLimit.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorGetMinLimit.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorGetRewindingStep.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorGetScanInfo.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorIsReady.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorIsRewindingRequired.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorIsUpdating.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorPark.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorRewind.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorSetConfiguration.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorSetup.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorXetAutoRewindingSteps.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorXetPosition.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/commands/test_derotatorXetRewindingMode.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/configurations/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/configurations/test_bsc.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/configurations/test_bsc_opt.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/configurations/test_custom.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/configurations/test_custom_opt.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/configurations/test_fixed.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/configurations/test_generic.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_get-setPosition.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_getManagementStatus.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_getPositionFromHistory.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_getScanInfo.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_isReady.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_isSlewing.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_nchannel.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_offset.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_park.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_rewind.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_rewindingmodes.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_setup.py create mode 100644 Common/Servers/PyDewarPositioner/test/functional/test_status_property.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_command.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorClearAutoRewindingSteps.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorGetCmdPosition.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorGetRewindingStep.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorGetScanInfo.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorIsReady.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorIsRewindingRequired.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorIsUpdating.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorPark.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorRewind.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorSetConfiguration.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorSetup.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorXetAutoRewindingSteps.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorXetPosition.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/commands/test_derotatorXetRewindingMode.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/configurations/test_bsc.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/configurations/test_bsc_opt.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/configurations/test_custom.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/configurations/test_custom_opt.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/configurations/test_fixed.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/configurations/test_generic.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_get-setPosition.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_getManagementStatus.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_getPositionFromHistory.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_getScanInfo.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_isReady.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_isSlewing.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_nchannel.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_offset.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_park.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_rewind.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_rewindingmodes.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_setup.py create mode 100644 Common/Servers/PyDewarPositioner/test/interface/test_status_property.py create mode 100644 Common/Servers/PyDewarPositioner/test/no_auto/updatePositionValues.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/cdbconf/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/cdbconf/test_cdbconf.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/devios/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/devios/test_status.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/posgen/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/posgen/test_galactic_parallactic.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/posgen/test_goto.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/posgen/test_parallactic.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/positioner/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/positioner/test_dec2bin.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/positioner/test_getScanInfo.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/positioner/test_goTo.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/positioner/test_init.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/positioner/test_offset.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/positioner/test_park.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/positioner/test_setup.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/positioner/test_startUpdating.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/positioner/test_status.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/positioner/test_stop.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/publisher/__init__.py create mode 100644 Common/Servers/PyDewarPositioner/test/pyunit/publisher/test_publisher.py create mode 100755 Common/Servers/PyDewarPositioner/test/run_coverage create mode 100644 Common/Servers/PyDewarPositioner/test/unittest.cpp create mode 100644 Common/Servers/PyLocalOscillator/ChangeLog create mode 100644 Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/CommandLine.py create mode 100644 Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/LocalOscillator.py create mode 100644 Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/LocalOscillatorSim.py create mode 100644 Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/__init__.py create mode 100644 Common/Servers/PyLocalOscillator/src/LocalOscillatorImpl/devios.py create mode 100644 Common/Servers/PyLocalOscillator/src/LocalOscillatorSimImpl/LocalOscillator.py create mode 100644 Common/Servers/PyLocalOscillator/src/LocalOscillatorSimImpl/__init__.py create mode 100644 Common/Servers/PyLocalOscillator/src/LocalOscillatorSimImpl/devios.py create mode 100644 Common/Servers/PyLocalOscillator/src/Makefile create mode 100644 Common/Servers/PyLocalOscillator/test/test_commandline.py create mode 100644 Common/Servers/PyLocalOscillator/test/test_component.py create mode 100644 Common/Servers/PyWeatherStation/ChangeLog create mode 100644 Common/Servers/PyWeatherStation/config/CDB/schemas/EnhancedWeatherStation.xsd create mode 100644 Common/Servers/PyWeatherStation/config/CDB/schemas/WeatherStationData.xsd create mode 100644 Common/Servers/PyWeatherStation/src/Makefile create mode 100644 Common/Servers/PyWeatherStation/src/WeatherStationImpl/WeatherStation.py create mode 100644 Common/Servers/PyWeatherStation/src/WeatherStationImpl/cdbjDAL.gclog create mode 100644 Common/Servers/PyWeatherStation/src/WeatherStationImpl/jmanager.gclog create mode 100644 Common/Servers/ReceiversBoss/config/CDB/schemas/ReceiversBoss.xsd create mode 100644 Common/Servers/ReceiversBoss/include/Configuration.h create mode 100644 Common/Servers/ReceiversBoss/include/DevIOBandWidth.h create mode 100644 Common/Servers/ReceiversBoss/include/DevIODerotatorPosition.h create mode 100644 Common/Servers/ReceiversBoss/include/DevIOFeeds.h create mode 100644 Common/Servers/ReceiversBoss/include/DevIOIFs.h create mode 100644 Common/Servers/ReceiversBoss/include/DevIOInitialFrequency.h create mode 100644 Common/Servers/ReceiversBoss/include/DevIOLO.h create mode 100644 Common/Servers/ReceiversBoss/include/DevIOMode.h create mode 100644 Common/Servers/ReceiversBoss/include/DevIOPolarization.h create mode 100644 Common/Servers/ReceiversBoss/include/DevIORecvCode.h create mode 100644 Common/Servers/ReceiversBoss/include/DevIOStatus.h create mode 100644 Common/Servers/ReceiversBoss/include/ReceiversBossImpl.h create mode 100644 Common/Servers/ReceiversBoss/include/RecvBossCore.h create mode 100644 Common/Servers/ReceiversBoss/include/WatchingThread.h create mode 100644 Common/Servers/ReceiversBoss/src/Configuration.cpp create mode 100644 Common/Servers/ReceiversBoss/src/Makefile create mode 100644 Common/Servers/ReceiversBoss/src/ReceiversBossImpl.cpp create mode 100644 Common/Servers/ReceiversBoss/src/RecvBossCore.cpp create mode 100644 Common/Servers/ReceiversBoss/src/RecvBossCore_mc.i create mode 100644 Common/Servers/ReceiversBoss/src/RecvBossCore_nt.i create mode 100644 Common/Servers/ReceiversBoss/src/WatchingThread.cpp create mode 100644 Common/Servers/Refraction/ChangeLog create mode 100644 Common/Servers/Refraction/config/CDB/schemas/Refraction.xsd create mode 100644 Common/Servers/Refraction/include/RefractionCore.h create mode 100644 Common/Servers/Refraction/include/RefractionImpl.h create mode 100644 Common/Servers/Refraction/include/RefractionWorkingThread.h create mode 100644 Common/Servers/Refraction/src/Makefile create mode 100644 Common/Servers/Refraction/src/RefractionCore.cpp create mode 100644 Common/Servers/Refraction/src/RefractionImpl.cpp create mode 100644 Common/Servers/Refraction/src/RefractionWorkingThread.cpp create mode 100644 Common/Servers/Refraction/src/TestClient.cpp create mode 100644 Common/Servers/Refraction/src/TestIter.cpp create mode 100644 Common/Servers/Refraction/src/TestRefro.cpp create mode 100644 Common/Servers/Refraction/src/medrefrw1.cpp create mode 100644 Common/Servers/Refraction/src/medrefrw2.cpp create mode 100644 Common/Servers/Refraction/test/NuovaDati.txt create mode 100644 Common/Servers/Refraction/test/VecchiaDati.txt create mode 100644 Common/Servers/Roach/config/CDB/schemas/Roach.xsd create mode 100644 Common/Servers/Roach/config/CDB/schemas/RoachSetup.xsd create mode 100644 Common/Servers/Roach/include/CommandLine.h create mode 100644 Common/Servers/Roach/include/Common.h create mode 100644 Common/Servers/Roach/include/Configuration.h create mode 100644 Common/Servers/Roach/include/ControlThread.h create mode 100644 Common/Servers/Roach/include/DevIOAttenuation.h create mode 100644 Common/Servers/Roach/include/DevIOBandWidth.h create mode 100644 Common/Servers/Roach/include/DevIOBins.h create mode 100644 Common/Servers/Roach/include/DevIOBusy.h create mode 100644 Common/Servers/Roach/include/DevIOFeed.h create mode 100644 Common/Servers/Roach/include/DevIOFrequency.h create mode 100644 Common/Servers/Roach/include/DevIOInputSection.h create mode 100644 Common/Servers/Roach/include/DevIOInputsNumber.h create mode 100644 Common/Servers/Roach/include/DevIOIntegration.h create mode 100644 Common/Servers/Roach/include/DevIOPolarization.h create mode 100644 Common/Servers/Roach/include/DevIOSampleRate.h create mode 100644 Common/Servers/Roach/include/DevIOSectionsNumber.h create mode 100644 Common/Servers/Roach/include/DevIOStatus.h create mode 100644 Common/Servers/Roach/include/DevIOTime.h create mode 100644 Common/Servers/Roach/include/DevIOTsys.h create mode 100644 Common/Servers/Roach/include/Protocol.h create mode 100644 Common/Servers/Roach/include/RoachImpl.h create mode 100644 Common/Servers/Roach/include/SenderThread.h create mode 100644 Common/Servers/Roach/src/CommandLine.cpp create mode 100644 Common/Servers/Roach/src/Configuration.cpp create mode 100644 Common/Servers/Roach/src/ControlThread.cpp create mode 100644 Common/Servers/Roach/src/Makefile create mode 100644 Common/Servers/Roach/src/Protocol.cpp create mode 100644 Common/Servers/Roach/src/RoachImpl.cpp create mode 100644 Common/Servers/Roach/src/SenderThread.cpp create mode 100755 Common/Servers/Roach/src/_send_backend_command create mode 100644 Common/Servers/Scheduler/config/CDB/schemas/Scheduler.xsd create mode 100644 Common/Servers/Scheduler/include/Configuration.h create mode 100644 Common/Servers/Scheduler/include/Core.h create mode 100644 Common/Servers/Scheduler/include/Core_Basic.h create mode 100644 Common/Servers/Scheduler/include/Core_Common.h create mode 100644 Common/Servers/Scheduler/include/Core_Extra.h create mode 100644 Common/Servers/Scheduler/include/Core_Getter.h create mode 100644 Common/Servers/Scheduler/include/Core_Operations.h create mode 100644 Common/Servers/Scheduler/include/Core_Resource.h create mode 100644 Common/Servers/Scheduler/include/DevIOCurrentBackend.h create mode 100644 Common/Servers/Scheduler/include/DevIOCurrentDevice.h create mode 100644 Common/Servers/Scheduler/include/DevIOCurrentRecorder.h create mode 100644 Common/Servers/Scheduler/include/DevIOProjectCode.h create mode 100644 Common/Servers/Scheduler/include/DevIORestFrequency.h create mode 100644 Common/Servers/Scheduler/include/DevIOScanNumber.h create mode 100644 Common/Servers/Scheduler/include/DevIOScheduleName.h create mode 100644 Common/Servers/Scheduler/include/DevIOStatus.h create mode 100644 Common/Servers/Scheduler/include/DevIOTracking.h create mode 100644 Common/Servers/Scheduler/include/Schedule.h create mode 100644 Common/Servers/Scheduler/include/ScheduleExecutor.h create mode 100644 Common/Servers/Scheduler/include/ScheduleReport.h create mode 100644 Common/Servers/Scheduler/include/SchedulerImpl.h create mode 100644 Common/Servers/Scheduler/src/Configuration.cpp create mode 100644 Common/Servers/Scheduler/src/Core.cpp create mode 100644 Common/Servers/Scheduler/src/Core_Basic.i create mode 100644 Common/Servers/Scheduler/src/Core_Common.i create mode 100644 Common/Servers/Scheduler/src/Core_Extra.i create mode 100644 Common/Servers/Scheduler/src/Core_Getter.i create mode 100644 Common/Servers/Scheduler/src/Core_Operations.i create mode 100644 Common/Servers/Scheduler/src/Core_Resource.i create mode 100644 Common/Servers/Scheduler/src/Makefile create mode 100644 Common/Servers/Scheduler/src/Schedule.cpp create mode 100644 Common/Servers/Scheduler/src/ScheduleChecker.cpp create mode 100644 Common/Servers/Scheduler/src/ScheduleExecutor.cpp create mode 100644 Common/Servers/Scheduler/src/ScheduleReport.cpp create mode 100644 Common/Servers/Scheduler/src/Schedule_ScanList.cpp create mode 100644 Common/Servers/Scheduler/src/SchedulerImpl.cpp create mode 100644 Common/Servers/Scheduler/src/SubScanBinder.cpp create mode 100644 Common/Servers/Scheduler/src/_tp_agc.py create mode 100644 Common/Servers/Scheduler/src/testLST2UT.cpp create mode 100644 Common/Servers/Scheduler/src/testSchedule.cpp create mode 100644 Common/Servers/Scheduler/templates/MapVirgo1x1.bck create mode 100644 Common/Servers/Scheduler/templates/MapVirgo1x1.cfg create mode 100644 Common/Servers/Scheduler/templates/MapVirgo1x1.lis create mode 100644 Common/Servers/Scheduler/templates/MapVirgo1x1.scd create mode 100644 Common/Servers/Scheduler/templates/Test.bck create mode 100644 Common/Servers/Scheduler/templates/Test.cfg create mode 100644 Common/Servers/Scheduler/templates/Test.lis create mode 100644 Common/Servers/Scheduler/templates/TestLST.scd create mode 100644 Common/Servers/Scheduler/templates/backend.tmpl create mode 100644 Common/Servers/Scheduler/templates/calib.bck create mode 100644 Common/Servers/Scheduler/templates/calib.cfg create mode 100644 Common/Servers/Scheduler/templates/calib.lis create mode 100644 Common/Servers/Scheduler/templates/calib.scd create mode 100644 Common/Servers/Scheduler/templates/config.tmpl create mode 100644 Common/Servers/Scheduler/templates/layoutfile.tmpl create mode 100644 Common/Servers/Scheduler/templates/pointing.scd create mode 100644 Common/Servers/Scheduler/templates/pointingBackend.cfg create mode 100644 Common/Servers/Scheduler/templates/pointingCalibrators.lis create mode 100644 Common/Servers/Scheduler/templates/pointingProcedure.cfg create mode 100644 Common/Servers/Scheduler/templates/scan.tmpl create mode 100644 Common/Servers/Scheduler/templates/schedule.tmpl create mode 100644 Common/Servers/Scheduler/templates/skydip.bck create mode 100644 Common/Servers/Scheduler/templates/skydip.cfg create mode 100644 Common/Servers/Scheduler/templates/skydip.lis create mode 100644 Common/Servers/Scheduler/templates/skydip.scd create mode 100644 Common/Servers/Scheduler/tests/.discos create mode 100644 Common/Servers/Scheduler/tests/Makefile create mode 100644 Common/Servers/Scheduler/tests/ScheduleReport_test.i create mode 100644 Common/Servers/Scheduler/tests/artefacts/schedule_text.aux create mode 100644 Common/Servers/Scheduler/tests/artefacts/schedule_text.scd create mode 100644 Common/Servers/Scheduler/tests/external/__init__.py create mode 100644 Common/Servers/Scheduler/tests/functional/__init__.py create mode 100644 Common/Servers/Scheduler/tests/gtest/procedurelist.cpp create mode 100644 Common/Servers/Scheduler/tests/procedure.cfg create mode 100644 Common/Servers/Scheduler/tests/pyunit/__init__.py create mode 100644 Common/Servers/Scheduler/tests/unittest.cpp create mode 100644 Common/Servers/SkySource/config/CDB/schemas/SourceCatalog.xsd create mode 100644 Common/Servers/SkySource/include/SkySourceImpl.h create mode 100644 Common/Servers/SkySource/include/TextClient.h create mode 100644 Common/Servers/SkySource/src/Makefile create mode 100644 Common/Servers/SkySource/src/SkySourceImpl.cpp create mode 100644 Common/Servers/SkySource/src/TextClient.cpp create mode 100644 Common/Servers/TotalPower/config/CDB/schemas/TotalPower.xsd create mode 100644 Common/Servers/TotalPower/config/CDB/schemas/TotalPowerSetup.xsd create mode 100644 Common/Servers/TotalPower/include/CommandLine.h create mode 100644 Common/Servers/TotalPower/include/Common.h create mode 100644 Common/Servers/TotalPower/include/Configuration.h create mode 100644 Common/Servers/TotalPower/include/ControlThread.h create mode 100644 Common/Servers/TotalPower/include/DevIOAttenuation.h create mode 100644 Common/Servers/TotalPower/include/DevIOBandWidth.h create mode 100644 Common/Servers/TotalPower/include/DevIOBins.h create mode 100644 Common/Servers/TotalPower/include/DevIOBusy.h create mode 100644 Common/Servers/TotalPower/include/DevIOFeed.h create mode 100644 Common/Servers/TotalPower/include/DevIOFrequency.h create mode 100644 Common/Servers/TotalPower/include/DevIOInputSection.h create mode 100644 Common/Servers/TotalPower/include/DevIOInputsNumber.h create mode 100644 Common/Servers/TotalPower/include/DevIOIntegration.h create mode 100644 Common/Servers/TotalPower/include/DevIOPolarization.h create mode 100644 Common/Servers/TotalPower/include/DevIOSampleRate.h create mode 100644 Common/Servers/TotalPower/include/DevIOSectionsNumber.h create mode 100644 Common/Servers/TotalPower/include/DevIOStatus.h create mode 100644 Common/Servers/TotalPower/include/DevIOTime.h create mode 100644 Common/Servers/TotalPower/include/DevIOTsys.h create mode 100644 Common/Servers/TotalPower/include/Protocol.h create mode 100644 Common/Servers/TotalPower/include/SenderThread.h create mode 100644 Common/Servers/TotalPower/include/TotalPowerImpl.h create mode 100644 Common/Servers/TotalPower/src/CommandLine.cpp create mode 100644 Common/Servers/TotalPower/src/Configuration.cpp create mode 100644 Common/Servers/TotalPower/src/ControlThread.cpp create mode 100644 Common/Servers/TotalPower/src/Makefile create mode 100644 Common/Servers/TotalPower/src/Protocol.cpp create mode 100644 Common/Servers/TotalPower/src/SenderThread.cpp create mode 100644 Common/Servers/TotalPower/src/TotalPowerImpl.cpp create mode 100644 Common/Servers/XBackend/Xbackend.xmi create mode 100644 Common/Servers/XBackend/config/CDB/schemas/XBackends.xsd create mode 100644 Common/Servers/XBackend/include/CommandLine.h create mode 100644 Common/Servers/XBackend/include/Common.h create mode 100644 Common/Servers/XBackend/include/Configuration.h create mode 100644 Common/Servers/XBackend/include/DevIOAttenuation.h create mode 100644 Common/Servers/XBackend/include/DevIOBandWidth.h create mode 100644 Common/Servers/XBackend/include/DevIOBins.h create mode 100644 Common/Servers/XBackend/include/DevIOBusy.h create mode 100644 Common/Servers/XBackend/include/DevIOFeed.h create mode 100755 Common/Servers/XBackend/include/DevIOFileName.h create mode 100644 Common/Servers/XBackend/include/DevIOFrequency.h create mode 100644 Common/Servers/XBackend/include/DevIOInputSection.h create mode 100644 Common/Servers/XBackend/include/DevIOInputsNumber.h create mode 100644 Common/Servers/XBackend/include/DevIOIntegration.h create mode 100644 Common/Servers/XBackend/include/DevIOMode8bit.h create mode 100644 Common/Servers/XBackend/include/DevIOPolarization.h create mode 100644 Common/Servers/XBackend/include/DevIOSampleRate.h create mode 100644 Common/Servers/XBackend/include/DevIOSectionsNumber.h create mode 100644 Common/Servers/XBackend/include/DevIOStatus.h create mode 100644 Common/Servers/XBackend/include/DevIOTime.h create mode 100644 Common/Servers/XBackend/include/DevIOTsys.h create mode 100644 Common/Servers/XBackend/include/FitsWriter.h create mode 100644 Common/Servers/XBackend/include/Timer.h create mode 100644 Common/Servers/XBackend/include/XBackendsImpl.h create mode 100644 Common/Servers/XBackend/include/XDataThread.h create mode 100644 Common/Servers/XBackend/include/XarcosThread.h create mode 100644 Common/Servers/XBackend/src/CommandLine.cpp create mode 100644 Common/Servers/XBackend/src/Configuration.cpp create mode 100644 Common/Servers/XBackend/src/FitsWriter.cpp create mode 100644 Common/Servers/XBackend/src/Makefile create mode 100644 Common/Servers/XBackend/src/Timer.cpp create mode 100644 Common/Servers/XBackend/src/XBackendsImpl.cpp create mode 100644 Common/Servers/XBackend/src/XDataThread.cpp create mode 100644 Common/Servers/XBackend/src/XarcosThread.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Adc.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Adc.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/ArcosEmulator.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/ArcosEmulator.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/CpldInterface.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/CpldInterface.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Dbbc.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Dbbc.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Emulator.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/FftSpectrometer.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/FftSpectrometer.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/HardwareBlock.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/IntThread.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/IntThread.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Makefile create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Semaphore.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Semaphore.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/SingleSpectrometer.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/SingleSpectrometer.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/SocketConnection.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/SocketConnection.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/SocketServer.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/SocketServer.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Spectrometer.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Spectrometer.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Thread.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/Thread.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/TpThread.cpp create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/TpThread.h create mode 100644 Common/Servers/XBackend/test/xarcos_emulator/emulator.tex create mode 100644 Common/Servers/dummy.txt create mode 100644 Common/Simulators/Components/PyAntennaBossSim/src/AntennaBossSim/AntennaBossSimImpl.py create mode 100644 Common/Simulators/Components/PyAntennaBossSim/src/AntennaBossSim/__init__.py create mode 100644 Common/Simulators/Components/PyAntennaBossSim/src/AntennaBossSim/devios.py create mode 100644 Common/Simulators/Components/PyAntennaBossSim/src/Makefile create mode 100644 Common/Simulators/Hardware/ReceiverBoardSim/src/Makefile create mode 100644 Common/Simulators/Hardware/ReceiverBoardSim/src/ReceiverBoardSimImpl/__init__.py create mode 100755 Common/Simulators/Hardware/ReceiverBoardSim/src/ReceiverBoardSimImpl/board_server.py create mode 100755 Common/Simulators/Hardware/ReceiverBoardSim/src/receiverboard-sim create mode 100644 Common/Simulators/Hardware/TCPGenericProtocolSim/src/Makefile create mode 100755 Common/Simulators/Hardware/TCPGenericProtocolSim/src/TCPGenericProtocolSimImpl/TCPServer.py create mode 100644 Common/Simulators/Hardware/TCPGenericProtocolSim/src/TCPGenericProtocolSimImpl/__init__.py create mode 100755 Common/Simulators/Hardware/TCPGenericProtocolSim/src/tcpProt-sim create mode 100644 Common/Tests/test/Makefile create mode 100644 Common/Tests/test/cdb/__init__.py create mode 100644 Common/Tests/test/cdb/test_procedures.py create mode 100644 Common/Tests/test/external/__init__.py create mode 100644 Common/Tests/test/functional/__init__.py create mode 100644 Common/Tests/test/pyunit/__init__.py create mode 100644 Common/Tests/test/unittest.cpp diff --git a/Common/Clients/AntennaBossTextClient/include/AntennaBossTextClient.h b/Common/Clients/AntennaBossTextClient/include/AntennaBossTextClient.h new file mode 100644 index 000000000..4e82b7e3c --- /dev/null +++ b/Common/Clients/AntennaBossTextClient/include/AntennaBossTextClient.h @@ -0,0 +1,110 @@ +#ifndef COMPONENTTEXTCLIENTTEMPLATE_H +#define COMPONENTTEXTCLIENTTEMPLATE_H + +/* **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(aorlati@ira.inaf.it) 07/02/2008 Creation */ +/* Andrea Orlati(aorlati@ira.inaf.it) 01/04/2010 Modified according the new AntennaBoss interface */ +/* Andrea Orlati(aorlati@ira.inaf.it) 09/04/2010 added the calls for the new wrappers methods of the boss */ +/* Andrea Orlati(aorlati@ira.inaf.it) 26/05/2011 review the code that displays the generators output */ +/* Andrea Orlati(aorlati@ira.inaf.it) 08/04/2013 changed the color of the led when correction are disabled from red to yellow */ +/* Andrea Orlati(aorlati@ira.inaf.it) 12/06/2014 displayed the reference and definition of radila velocity */ + + +/* Add the component skeleton header file */ +/* ************************************* */ +#include +/* ************************************* */ + +/* Add the component errors header file */ +/* ************************************* */ +#include +#include +/* ************************************* */ + +/* Add the client specific errors header file */ +/* ************************************* */ +#include +/* ************************************* */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define GRAY_COLOR 0 +#define BLUE_GRAY 0 +#define GRAY_BLUE 1 +#define BLACK_RED 2 +#define BLACK_GREEN 3 +#define BLACK_YELLOW 4 +#define BLACK_BLUE 5 +#define BLACK_MAGENTA 6 +#define BLACK_WHITE 7 + +/* define the max number of arguments that can be passed to component methods */ +/* ************************************************************************** */ +#define MAXFIELDNUMBER 12 +/* ************************************************************************** */ + +/* define the main frame dimension */ +/* ******************************* */ +#define WINDOW_WIDTH 82 /*columns */ +#define WINDOW_HEIGHT 32 /* rows */ +/* ******************************* */ + +/* define the routine name here, to be used for logging */ +/* **************************************************** */ +#define MODULE_NAME "antennaBossTui" /* the name of this module (filename without .cpp) */ +/* **************************************************** */ + +/* define the application title and style */ +/* ************************************* */ +#define APPLICATION_TITLE "Antenna Boss" /* the title of the main frame */ +#define TITLE_COLOR_PAIR CColorPair::RED_BLACK /* the title color and background */ +#define TITLE_STYLE CStyle::BOLD|CStyle::UNDERLINE /* the title style */ +/* ************************************* */ + +/* define name and component interface */ +/* ********************************** */ +//#define COMPONENT_NAME "ANTENNA/Boss" /* the name of the istantiation of the component */ +#define COMPONENT_INTERFACE_TPYE "IDL:alma/Antenna/AntennaBoss:1.0" /* the type of the interface */ +#define COMPONENT_IDL_MODULE Antenna /* the IDL module that contains the component interface */ +#define COMPONENT_IDL_INTERFACE AntennaBoss /* the IDL interface of the component */ +#define COMPONENT_SMARTPOINTER AntennaBoss_var /* the component type */ +/* ********************************** */ + +/* define user input command style */ +/* ******************************* */ +#define USER_INPUT_COLOR_PAIR BLUE_GRAY /* user input color and background */ +#define USER_INPUT_STYLE CStyle::NORMAL /* user input style */ +/* ******************************* */ + +/* define output field look and feel */ +/* ********************************* */ +#define USE_OUTPUT_FIELD 1 /* 0 disable the output field */ +#define OUTPUT_FIELD_COLOR_PAIR GRAY_BLUE /* output field color and background */ +#define OUTPUT_FIELD_STYLE CStyle::NORMAL /* output field style */ +#define OUTPUT_FIELD_HEIGHT 4 /* output field height (number of rows) */ +/* ********************************* */ + +/* define this value (milliseconds) to set the log guard interval */ +#define GUARDINTERVAL 1000 +/* to send the client to sleep for a certain ammount of time, setup this value (milliseconds) */ +#define MAINTHREADSLEEPTIME 250 + +#endif diff --git a/Common/Clients/AntennaBossTextClient/include/UpdateGenerator.i b/Common/Clients/AntennaBossTextClient/include/UpdateGenerator.i new file mode 100644 index 000000000..395214319 --- /dev/null +++ b/Common/Clients/AntennaBossTextClient/include/UpdateGenerator.i @@ -0,0 +1,254 @@ +#ifndef _UPDATEGENERATOR_I_ +#define _UPDATEGENERATOR_I_ + +// $Id: UpdateGenerator.i,v 1.9 2011-05-26 14:18:34 a.orlati Exp $ + +void updateGenerator(maci::SimpleClient& client,Antenna::TGeneratorType& lastGeneratorType,Antenna::EphemGenerator_var& lastGenerator) { + //Antenna::EphemGenerator_var gen; + char *gen; + IRA::CString generatorName; + Antenna::TGeneratorType type; + IRA::CString outString,tmpString; + baci::BACIValue bValue; + try { + gen=component->getGeneratorCURL(type); + generatorName=IRA::CString(gen); + CORBA::string_free(gen); + } + catch (CORBA::SystemException& ex) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"::Main()"); + impl.setName(ex._name()); + impl.setMinor(ex.minor()); + _IRA_LOGGUARD_LOG_EXCEPTION(guard,impl,LM_ERROR); + return; + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); + _IRA_LOGGUARD_LOG_EXCEPTION(guard,impl,LM_ERROR); + return; + } + if ((type==Antenna::ANT_NONE) || (type!=lastGeneratorType)) { // the current generator should be released + if (!CORBA::is_nil(lastGenerator)) { + try { + client.releaseComponent(lastGenerator->name()); + } + catch (maciErrType::CannotReleaseComponentExImpl& E) { + _IRA_LOGGUARD_LOG_EXCEPTION(guard,E,LM_ERROR); + } + catch (...) { + } + lastGenerator=Antenna::EphemGenerator::_nil(); + lastGeneratorType=Antenna::ANT_NONE; + } + } + //if (!CORBA::is_nil(gen)) { + if (type!=lastGeneratorType) { + try { + lastGenerator=client.getComponent(generatorName,0,true); + } + catch (maciErrType::CannotGetComponentExImpl& E) { + _ADD_BACKTRACE(ClientErrors::CouldntAccessComponentExImpl,impl,E,MODULE_NAME"::Main()"); + impl.setComponentName((const char *)generatorName); + _IRA_LOGGUARD_LOG_EXCEPTION(guard,impl,LM_ERROR); + return; + } + catch (CORBA::SystemException& ex) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"::Main()"); + impl.setName(ex._name()); + impl.setMinor(ex.minor()); + _IRA_LOGGUARD_LOG_EXCEPTION(guard,impl,LM_ERROR); + return; + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); + _IRA_LOGGUARD_LOG_EXCEPTION(guard,impl,LM_ERROR); + return; + } + lastGeneratorType=type; + } + if (!CORBA::is_nil(lastGenerator)) { + switch (type) { + case Antenna::ANT_SIDEREAL : { + IRA::CString str1,str2; + Antenna::SkySourceAttributes_var att; + Antenna::SkySource_var sidereal; + try { + sidereal=Antenna::SkySource::_narrow(lastGenerator); + //sidereal=Antenna::SkySource::_narrow(gen); + if (!CORBA::is_nil(sidereal)) { + sidereal->getAttributes(att); + } + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); + _IRA_LOGGUARD_LOG_EXCEPTION(guard,impl,LM_ERROR); + return; + } + tmpString=(const char*)att->sourceID; + outString="Source name : "+tmpString; + extraLabel1->setValue(outString); + extraLabel1->Refresh(); + IRA::CIRATools::radToHourAngle(att->inputRightAscension,str1); + IRA::CIRATools::radToSexagesimalAngle(att->inputDeclination,str2); + outString="Catalog Eq. : "+str1+"/"+str2+"/"; + tmpString.Format("%.1lf %.2lf %.2lf %.2lf %.2lf",att->inputJEpoch,att->inputRaProperMotion,att->inputDecProperMotion, + att->inputParallax,att->inputRadialVelocity); + outString+=tmpString; + extraLabel2-> setValue(outString); + extraLabel2->Refresh(); + IRA::CIRATools::radToAngle(att->inputGalacticLongitude,str1); + IRA::CIRATools::radToAngle(att->inputGalacticLatitude,str2); + outString="Catalog Gal. : "+str1+"/"+str2; + extraLabel3->setValue(outString); + extraLabel3->Refresh(); + IRA::CIRATools::radToHourAngle(att->rightAscension,str1); + IRA::CIRATools::radToSexagesimalAngle(att->declination,str2); + outString="Apparent Eq. : "+str1+"/"+str2+"/"; + str1.Format("%.5lf",att->julianEpoch); + outString+=str1; + extraLabel4->setValue(outString); + extraLabel4->Refresh(); + IRA::CIRATools::radToAngle(att->gLongitude,str1); + IRA::CIRATools::radToAngle(att->gLatitude,str2); + outString="Galactic : "+str1+"/"+str2; + extraLabel5->setValue(outString); + extraLabel5->Refresh(); + IRA::CIRATools::radToAngle(att->azimuth,str1); + IRA::CIRATools::radToAngle(att->elevation,str2); + outString="Horizontal : "+str1+"/"+str2; + extraLabel6->setValue(outString); + extraLabel6->Refresh(); + break; + } + case Antenna::ANT_MOON : { + IRA::CString str1,str2; + Antenna::MoonAttributes_var att; + Antenna::Moon_var moon; + try { + moon=Antenna::Moon::_narrow(lastGenerator); + if (!CORBA::is_nil(moon)) { + moon->getAttributes(att); + } + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); + _IRA_LOGGUARD_LOG_EXCEPTION(guard,impl,LM_ERROR); + return; + } + tmpString=(const char*)att->sourceID; + outString="Source name : "+tmpString; + extraLabel1->setValue(outString); + extraLabel1->Refresh(); + IRA::CIRATools::radToHourAngle(att->rightAscension,str1); + IRA::CIRATools::radToSexagesimalAngle(att->declination,str2); + outString="Apparent Eq. : "+str1+"/"+str2+"/"; + str1.Format("%.5lf",att->julianEpoch); + outString+=str1; + extraLabel2->setValue(outString); + extraLabel2->Refresh(); + IRA::CIRATools::radToAngle(att->gLongitude,str1); + IRA::CIRATools::radToAngle(att->gLatitude,str2); + outString="Galactic : "+str1+"/"+str2; + extraLabel3->setValue(outString); + extraLabel4->Refresh(); + IRA::CIRATools::radToAngle(att->azimuth,str1); + IRA::CIRATools::radToAngle(att->elevation,str2); + outString="Horizontal : "+str1+"/"+str2; + extraLabel4->setValue(outString); + extraLabel4->Refresh(); + extraLabel5->setValue(""); + extraLabel5->Refresh(); + extraLabel6->setValue(""); + extraLabel6->Refresh(); + break; + } + case Antenna::ANT_OTF: { + Antenna::OTFAttributes_var att; + Antenna::OTF_var otf; + IRA::CString str1,str2; + try { + otf=Antenna::OTF::_narrow(lastGenerator); + if (!CORBA::is_nil(otf)) { + otf->getAttributes(att); + } + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); + _IRA_LOGGUARD_LOG_EXCEPTION(guard,impl,LM_ERROR); + return; + } + IRA::CIRATools::radToAngle(att->startLon,str1); + IRA::CIRATools::radToAngle(att->startLat,str2); + outString="Start-Center-Stop: "+str1+"/"+str2+" - "; + IRA::CIRATools::radToAngle(att->centerLon,str1); + IRA::CIRATools::radToAngle(att->centerLat,str2); + outString+=str1+"/"+str2+" - "; + IRA::CIRATools::radToAngle(att->stopLon,str1); + IRA::CIRATools::radToAngle(att->stopLat,str2); + outString+=str1+"/"+str2; + extraLabel1->setValue(outString); + extraLabel1->Refresh(); + IRA::CIRATools::timeToStr(att->startUT,str1); + IRA::CIRATools::intervalToStr(att->subScanDuration,str2); + outString="StartTime-Dur. : "+str1+" - "+str2; + extraLabel2->setValue(outString); + extraLabel2->Refresh(); + IRA::CIRATools::radToHourAngle(att->J2000RightAscension,str1); + IRA::CIRATools::radToSexagesimalAngle(att->J2000Declination,str2); + outString="J2000-Apparent eq: "+str1+"/"+str2+" - "; + IRA::CIRATools::radToHourAngle(att->rightAscension,str1); + IRA::CIRATools::radToSexagesimalAngle(att->declination,str2); + outString+=str1+"/"+str2; + extraLabel3->setValue(outString); + extraLabel3->Refresh(); + IRA::CIRATools::radToAngle(att->azimuth,str1); + IRA::CIRATools::radToAngle(att->elevation,str2); + outString="Horizontal : "+str1+"/"+str2; + extraLabel4->setValue(outString); + extraLabel4->Refresh(); + IRA::CIRATools::radToAngle(att->gLongitude,str1); + IRA::CIRATools::radToAngle(att->gLatitude,str2); + outString="Galactic : "+str1+"/"+str2; + extraLabel5->setValue(outString); + extraLabel5->Refresh(); + str1.Format("%.4lf",att->skyRate*DR2D); + str2.Format("%.4lf",att->phiRate*DR2D); + outString="Sky/Phi rates : "+str1+"/"+str1; + extraLabel6->setValue(outString); + extraLabel6->Refresh(); + break; + } + default : { //ANT_NONE + extraLabel1-> setValue(""); + extraLabel1->Refresh(); + extraLabel2-> setValue(""); + extraLabel2->Refresh(); + extraLabel3-> setValue(""); + extraLabel3->Refresh(); + extraLabel4-> setValue(""); + extraLabel4->Refresh(); + extraLabel5-> setValue(""); + extraLabel5->Refresh(); + extraLabel6-> setValue(""); + extraLabel6->Refresh(); + } + } + } + else { + extraLabel1-> setValue(""); + extraLabel1->Refresh(); + extraLabel2-> setValue(""); + extraLabel2->Refresh(); + extraLabel3-> setValue(""); + extraLabel3->Refresh(); + extraLabel4-> setValue(""); + extraLabel4->Refresh(); + extraLabel5-> setValue(""); + extraLabel5->Refresh(); + extraLabel6-> setValue(""); + extraLabel6->Refresh(); + } +} + + +#endif /*UPDATEGENERATOR_I_*/ diff --git a/Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp b/Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp new file mode 100644 index 000000000..931f2aed3 --- /dev/null +++ b/Common/Clients/AntennaBossTextClient/src/AntennaBossTextClient.cpp @@ -0,0 +1,644 @@ + +#include "AntennaBossTextClient.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define _GET_ACS_PROPERTY(TYPE,NAME) TYPE##_var NAME; \ +{ \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,"Trying to get property "#NAME"...")); \ + NAME=component->NAME(); \ + if (NAME.ptr()!=TYPE::_nil()) { \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %x",NAME.ptr())); \ + } \ + else { \ + _EXCPT(ClientErrors::CouldntAccessPropertyExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setPropertyName(#NAME); \ + impl.log(); \ + goto ErrorLabel; \ + } \ +} + +#define _INSTALL_MONITOR(COMP,TRIGGERTIME) { \ + if (!COMP->installAutomaticMonitor(GUARDINTERVAL)) { \ + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setAction("Install monitor"); \ + impl.setReason((const char*)COMP->getLastError()); \ + impl.log(); \ + ACE_OS::sleep(1); \ + goto ErrorLabel; \ + } \ + COMP->setTriggerTime(TRIGGERTIME); \ +} + +#define _GET_PROPERTY_VALUE_ONCE(TYPE,FORMAT,PROPERTY,PROPERTNAME,CONTROL) { \ + try { \ + TYPE temp; \ + ACSErr::Completion_var cmpl; \ + temp=PROPERTY->get_sync(cmpl.out()); \ + CompletionImpl cmplImpl(cmpl.in()); \ + if (cmplImpl.isErrorFree()) { \ + IRA::CString val(0,FORMAT,temp); \ + CONTROL->setValue(val); \ + CONTROL->Refresh(); \ + } \ + else { \ + _ADD_BACKTRACE(ClientErrors::CouldntAccessPropertyExImpl,impl,cmplImpl,"::Main()"); \ + impl.setPropertyName(PROPERTNAME); \ + impl.log(); \ + goto ErrorLabel; \ + } \ + } \ + catch (...) { \ + _EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); \ + impl.log(); \ + goto ErrorLabel; \ + } \ +} + +#define COMPONENT_INTERFACE COMPONENT_IDL_MODULE::COMPONENT_IDL_INTERFACE +#define COMPONENT_DECLARATION COMPONENT_IDL_MODULE::COMPONENT_SMARTPOINTER + +#define TEMPLATE_4_ROTGENERATORTYPE Antenna::ROTGeneratorType_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var +#define TEMPLATE_4_ROTBOOLEAN Management::ROTBoolean_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var +#define TEMPLATE_4_ROTSYSTEMSTATUS Management::ROTSystemStatus_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var + +#define TEMPLATE_4_ROTREFERENCEFRAME Antenna::ROTReferenceFrame_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var +#define TEMPLATE_4_ROTVRADDEFINITION Antenna::ROTVradDefinition_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var + + +using namespace TW; + +static bool terminate; + +void quintHandler(int sig) +{ + terminate=true; +} + +IRA::CLogGuard guard(GUARDINTERVAL*1000); +TW::CLabel* extraLabel1; +TW::CLabel* extraLabel2; +TW::CLabel* extraLabel3; +TW::CLabel* extraLabel4; +TW::CLabel* extraLabel5; +TW::CLabel* extraLabel6; +// Component declaration +COMPONENT_DECLARATION component=COMPONENT_INTERFACE::_nil(); +nc::SimpleConsumer *simpleConsumer=NULL; + +#include "UpdateGenerator.i" + +void NotificationHandler(Antenna::AntennaDataBlock data,void *handlerParam) +{ + TW::CLedDisplay *control;; + control=static_cast(handlerParam); + if (data.tracking) { + control->setValue("1"); + control->Refresh(); + } + else { + control->setValue("0"); + control->Refresh(); + } +} + +int main(int argc, char *argv[]) { + bool loggedIn=false; + //int fieldCounter; + maci::SimpleClient client; + ACE_Time_Value tv(3); + //IRA::CString fields[MAXFIELDNUMBER]; + IRA::CString inputCommand; + + maci::ComponentInfo_var info; + CORBA::Object_var obj; + + Antenna::TGeneratorType lastGeneratorType=Antenna::ANT_NONE; + Antenna::EphemGenerator_var lastGenerator=Antenna::EphemGenerator::_nil(); + + char fluxFormat[20]; + + /* Add frame controls declaration */ + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING> *target_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *targetRA_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *targetDec_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *targetVrad_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *azOff_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *elOff_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *raOff_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *decOff_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *lonOff_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *latOff_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *rawAzimuth_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *rawElevation_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *observedAzimuth_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *observedElevation_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *observedRightAscension_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *observedDeclination_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *observedGalLongitude_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *observedGalLatitude_field; + TW::CPropertyStatusBox* generatorType_box; + TW::CPropertyLedDisplay * enabled_display; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *pointingAzimuthCorrection_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *pointingElevationCorrection_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *refractionCorrection_field; + TW::CPropertyStatusBox * status_box; + + TW::CPropertyStatusBox * refFrame_box; + TW::CPropertyStatusBox * velDef_box; + + TW::CLedDisplay * tracking_display; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *FWHM_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *targetFlux_field; + TW::CPropertyLedDisplay * correctionEnabled_display; + + /* ******************************* */ + TW::CLabel *output_label; + TW::CInputCommand *userInput; + + terminate=false; + + // mainframe + TW::CFrame window(CPoint(0,0),CPoint(WINDOW_WIDTH,WINDOW_HEIGHT),'|','|','-','-'); + + // disable ctrl+C + signal(SIGINT,SIG_IGN); + signal(SIGUSR1,quintHandler); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"MANAGER_LOGGING")); + try { + if (client.init(argc,argv)==0) { + _EXCPT(ClientErrors::CouldntInitExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + else { + if (client.login()==0) { + _EXCPT(ClientErrors::CouldntLoginExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + loggedIn=true; + } + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + // Window initialization + window.initFrame(); + window.setTitle(APPLICATION_TITLE); + // Change the style of the main frame + window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); + + if (window.colorReady()) { + window.defineColor(GRAY_COLOR,255,255,255); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); + window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); + } + else { + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_DEFAULT_COMPONENENT: %s",COMPONENT_INTERFACE_TPYE)); + + try { + info=client.manager()->get_default_component(client.handle(),COMPONENT_INTERFACE_TPYE); + obj=info->reference; + if (CORBA::is_nil(obj.in())) { + _EXCPT(ClientErrors::CouldntAccessComponentExImpl,impl,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_INTERFACE_TPYE); + impl.log(); + goto ErrorLabel; + } + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ClientErrors::CouldntAccessComponentExImpl,impl,E,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_INTERFACE_TPYE); + impl.log(); + goto ErrorLabel; + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + component=COMPONENT_INTERFACE::_narrow(obj.in()); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %d",component.ptr())); + ACE_OS::sleep(1); + try { + /* Add all component properties here */ + _GET_ACS_PROPERTY(ACS::ROstring,target); + _GET_ACS_PROPERTY(ACS::ROdouble,targetRightAscension); + _GET_ACS_PROPERTY(ACS::ROdouble,targetDeclination); + _GET_ACS_PROPERTY(ACS::ROdouble,targetVrad); + _GET_ACS_PROPERTY(Antenna::ROTReferenceFrame,vradReferenceFrame); + _GET_ACS_PROPERTY(Antenna::ROTVradDefinition,vradDefinition); + _GET_ACS_PROPERTY(ACS::ROdouble,azimuthOffset); + _GET_ACS_PROPERTY(ACS::ROdouble,elevationOffset); + _GET_ACS_PROPERTY(ACS::ROdouble,rightAscensionOffset); + _GET_ACS_PROPERTY(ACS::ROdouble,declinationOffset); + _GET_ACS_PROPERTY(ACS::ROdouble,longitudeOffset); + _GET_ACS_PROPERTY(ACS::ROdouble,latitudeOffset); + _GET_ACS_PROPERTY(ACS::ROdouble,rawAzimuth); + _GET_ACS_PROPERTY(ACS::ROdouble,rawElevation); + _GET_ACS_PROPERTY(ACS::ROdouble,observedAzimuth); + _GET_ACS_PROPERTY(ACS::ROdouble,observedElevation); + _GET_ACS_PROPERTY(ACS::ROdouble,observedRightAscension); + _GET_ACS_PROPERTY(ACS::ROdouble,observedDeclination); + _GET_ACS_PROPERTY(ACS::ROdouble,observedGalLongitude); + _GET_ACS_PROPERTY(ACS::ROdouble,observedGalLatitude); + _GET_ACS_PROPERTY(Antenna::ROTGeneratorType,generatorType); + _GET_ACS_PROPERTY(Management::ROTBoolean,enabled); + _GET_ACS_PROPERTY(Management::ROTBoolean,correctionEnabled); + _GET_ACS_PROPERTY(ACS::ROdouble,pointingAzimuthCorrection); + _GET_ACS_PROPERTY(ACS::ROdouble,pointingElevationCorrection); + _GET_ACS_PROPERTY(ACS::ROdouble,refractionCorrection); + _GET_ACS_PROPERTY(Management::ROTSystemStatus,status); + _GET_ACS_PROPERTY(ACS::ROdouble,FWHM); + _GET_ACS_PROPERTY(ACS::ROdouble,targetFlux); + + /* ********************************* */ + ACE_OS::sleep(1); + + /** Frame controls creation */ + target_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING>(target.in()); + targetRA_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(targetRightAscension.in()); + targetDec_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(targetDeclination.in()); + targetVrad_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(targetVrad.in()); + azOff_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(azimuthOffset.in()); + elOff_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(elevationOffset.in()); + raOff_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(rightAscensionOffset.in()); + decOff_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(declinationOffset.in()); + lonOff_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(longitudeOffset.in()); + latOff_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(latitudeOffset.in()); + rawAzimuth_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(rawAzimuth.in()); + rawElevation_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(rawElevation.in()); + observedAzimuth_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(observedAzimuth.in()); + observedElevation_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(observedElevation.in()); + observedRightAscension_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(observedRightAscension.in()); + observedDeclination_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(observedDeclination.in()); + observedGalLongitude_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(observedGalLongitude.in()); + observedGalLatitude_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(observedGalLatitude.in()); + generatorType_box=new TW::CPropertyStatusBox + (generatorType.in(),Antenna::ANT_NONE); + enabled_display=new TW::CPropertyLedDisplay(enabled.in(),1); + correctionEnabled_display=new TW::CPropertyLedDisplay(correctionEnabled.in(),1); + pointingAzimuthCorrection_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(pointingAzimuthCorrection.in()); + pointingElevationCorrection_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(pointingElevationCorrection.in()); + refractionCorrection_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(refractionCorrection.in()); + status_box=new TW::CPropertyStatusBox (status.in(),Management::MNG_OK); + refFrame_box=new TW::CPropertyStatusBox(vradReferenceFrame.in(),Antenna::ANT_UNDEF_FRAME); + velDef_box=new TW::CPropertyStatusBox(vradDefinition.in(),Antenna::ANT_UNDEF_DEF); + FWHM_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(FWHM.in()); + targetFlux_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(targetFlux.in()); + extraLabel1=new CLabel(""); + extraLabel2=new CLabel(""); + extraLabel3=new CLabel(""); + extraLabel4=new CLabel(""); + extraLabel5=new CLabel(""); + extraLabel6=new CLabel(""); + tracking_display=new TW::CLedDisplay(1); + + /* ************************ */ + #if USE_OUTPUT_FIELD >=1 + output_label=new TW::CLabel(""); + #else + output_label=NULL; + #endif + userInput=new TW::CInputCommand(); + + /** setting up the properties of the components of the frame controls */ + _TW_SET_COMPONENT(targetRA_field,22,1,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(targetDec_field,37,1,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(targetFlux_field,52,1,11,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(target_field,0,1,17,1,CColorPair::GREEN_BLACK,CStyle::UNDERLINE,output_label); + + _TW_SET_COMPONENT(targetVrad_field,22,2,11,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + + _TW_SET_COMPONENT(refFrame_box,34,2,12,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(velDef_box,47,2,12,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + + _TW_SET_COMPONENT(azOff_field,22,3,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(elOff_field,37,3,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(raOff_field,22,4,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(decOff_field,37,4,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(lonOff_field,22,5,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(latOff_field,37,5,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(rawAzimuth_field,22,6,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(rawElevation_field,37,6,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(observedAzimuth_field,22,7,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(observedElevation_field,37,7,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(observedRightAscension_field,22,8,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(observedDeclination_field,37,8,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(observedGalLongitude_field,22,9,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(observedGalLatitude_field,37,9,14,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(generatorType_box,22,10,10,1,BLACK_GREEN,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(pointingAzimuthCorrection_field,22,11,10,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(pointingElevationCorrection_field,32,11,10,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(refractionCorrection_field,42,11,10,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(FWHM_field,22,12,10,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + enabled_display->setPosition(CPoint(22,13)); + tracking_display->setPosition(CPoint(22,14)); + correctionEnabled_display->setPosition(CPoint(22,15)); + _TW_SET_COMPONENT(status_box,22,16,10,1,BLACK_GREEN,CStyle::BOLD,output_label); + + // setting up the controls look and feel........ + enabled_display->setOrientation(TW::CPropertyLedDisplay::HORIZONTAL); + enabled_display->setOutputComponent((CFrameComponent*) output_label); + enabled_display->setLedStyle(0,TW::CStyle(CColorPair::RED_BLACK,0),TW::CStyle(CColorPair::GREEN_BLACK,0),'o','@'); + correctionEnabled_display->setOrientation(TW::CPropertyLedDisplay::HORIZONTAL); + correctionEnabled_display->setOutputComponent((CFrameComponent*) output_label); + correctionEnabled_display->setLedStyle(0,TW::CStyle(CColorPair::YELLOW_BLACK,0),TW::CStyle(CColorPair::GREEN_BLACK,0),'o','@'); + rawAzimuth_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + rawElevation_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + observedAzimuth_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + observedElevation_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + observedRightAscension_field->setFormatFunction(CFormatFunctions::angleFormat,static_cast(&observedRightAscension_field)); + observedDeclination_field->setFormatFunction(CFormatFunctions::angleFormat,NULL); + targetRA_field->setFormatFunction(CFormatFunctions::angleFormat,static_cast(&targetRA_field)); + targetDec_field->setFormatFunction(CFormatFunctions::angleFormat,NULL); + targetVrad_field->setFormatFunction(CFormatFunctions::floatingPointFormat,NULL); + strcpy(fluxFormat,"(%05.1lf Jy)"); + targetFlux_field->setFormatFunction(CFormatFunctions::floatingPointFormat,static_cast(fluxFormat)); + azOff_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + elOff_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + raOff_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); //format as hh.mm.ss.ss + decOff_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + lonOff_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + latOff_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + observedGalLongitude_field->setFormatFunction(CFormatFunctions::angleFormat,NULL); + observedGalLatitude_field->setFormatFunction(CFormatFunctions::angleFormat,NULL); + pointingAzimuthCorrection_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + pointingElevationCorrection_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + refractionCorrection_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + generatorType_box->setStatusLook(Antenna::ANT_NONE,CStyle(BLACK_RED,CStyle::BOLD)); + generatorType_box->setStatusLook(Antenna::ANT_SIDEREAL); + generatorType_box->setStatusLook(Antenna::ANT_MOON); + generatorType_box->setStatusLook(Antenna::ANT_SUN); + generatorType_box->setStatusLook(Antenna::ANT_SOLARSYTEMBODY); + generatorType_box->setStatusLook(Antenna::ANT_SATELLITE); + generatorType_box->setStatusLook(Antenna::ANT_OTF); + + status_box->setStatusLook(Management::MNG_OK,CStyle(BLACK_GREEN,CStyle::BOLD)); + status_box->setStatusLook(Management::MNG_WARNING,CStyle(BLACK_YELLOW,CStyle::BOLD)); + status_box->setStatusLook(Management::MNG_FAILURE,CStyle(BLACK_RED,CStyle::BOLD)); + + refFrame_box->setStatusLook(Antenna::ANT_BARY); + refFrame_box->setStatusLook(Antenna::ANT_LSRK); + refFrame_box->setStatusLook(Antenna::ANT_LSRD); + refFrame_box->setStatusLook(Antenna::ANT_GALCEN); + refFrame_box->setStatusLook(Antenna::ANT_LGROUP); + refFrame_box->setStatusLook(Antenna::ANT_TOPOCEN); + refFrame_box->setStatusLook(Antenna::ANT_UNDEF_FRAME); + velDef_box->setStatusLook(Antenna::ANT_RADIO); + velDef_box->setStatusLook(Antenna::ANT_OPTICAL); + velDef_box->setStatusLook(Antenna::ANT_REDSHIFT); + velDef_box->setStatusLook(Antenna::ANT_UNDEF_DEF); + + tracking_display->setOrientation(TW::CLedDisplay::HORIZONTAL); + tracking_display->setLedStyle(0,TW::CStyle(CColorPair::GREEN_BLACK,0),TW::CStyle(CColorPair::RED_BLACK,0)); + FWHM_field->setFormatFunction(CFormatFunctions::coordinateFormat,NULL); + + // extra labels.......... + extraLabel1->setWidth(WINDOW_WIDTH-2); extraLabel1->setHeight(1); extraLabel1->setPosition(TW::CPoint(0,19)); + extraLabel2->setWidth(WINDOW_WIDTH-2); extraLabel2->setHeight(1); extraLabel2->setPosition(TW::CPoint(0,20)); + extraLabel3->setWidth(WINDOW_WIDTH-2); extraLabel3->setHeight(1); extraLabel3->setPosition(TW::CPoint(0,21)); + extraLabel4->setWidth(WINDOW_WIDTH-2); extraLabel4->setHeight(1); extraLabel4->setPosition(TW::CPoint(0,22)); + extraLabel5->setWidth(WINDOW_WIDTH-2); extraLabel5->setHeight(1); extraLabel5->setPosition(TW::CPoint(0,23)); + extraLabel6->setWidth(WINDOW_WIDTH-2); extraLabel6->setHeight(1); extraLabel6->setPosition(TW::CPoint(0,24)); + + /* ****************************************************************** */ + _TW_SET_COMPONENT(userInput,0,WINDOW_HEIGHT-6,WINDOW_WIDTH-1,1,USER_INPUT_COLOR_PAIR,USER_INPUT_STYLE,NULL); + #if USE_OUTPUT_FIELD >=1 + _TW_SET_COMPONENT(output_label,0,WINDOW_HEIGHT-(OUTPUT_FIELD_HEIGHT+1),WINDOW_WIDTH-1,OUTPUT_FIELD_HEIGHT,OUTPUT_FIELD_COLOR_PAIR,OUTPUT_FIELD_STYLE,NULL); + #endif + + // Monitors + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MONITORS_INSTALLATION")); + /** Add all required monitor installation here */ + + _INSTALL_MONITOR(target_field,2000); + _INSTALL_MONITOR(targetRA_field,2000); + _INSTALL_MONITOR(targetDec_field,2000); + _INSTALL_MONITOR(targetVrad_field,2000); + _INSTALL_MONITOR(refFrame_box,2000); + _INSTALL_MONITOR(velDef_box,2000); + _INSTALL_MONITOR(targetFlux_field,2000); + _INSTALL_MONITOR(azOff_field,500); + _INSTALL_MONITOR(elOff_field,500); + _INSTALL_MONITOR(raOff_field,500); + _INSTALL_MONITOR(decOff_field,500); + _INSTALL_MONITOR(lonOff_field,500); + _INSTALL_MONITOR(latOff_field,500); + _INSTALL_MONITOR(rawAzimuth_field,300); + _INSTALL_MONITOR(rawElevation_field,300); + _INSTALL_MONITOR(observedAzimuth_field,300); + _INSTALL_MONITOR(observedElevation_field,300); + _INSTALL_MONITOR(observedRightAscension_field,300); + _INSTALL_MONITOR(observedDeclination_field,300); + _INSTALL_MONITOR(observedGalLongitude_field,300); + _INSTALL_MONITOR(observedGalLatitude_field,300); + _INSTALL_MONITOR(pointingAzimuthCorrection_field,300); + _INSTALL_MONITOR(pointingElevationCorrection_field,300); + _INSTALL_MONITOR(refractionCorrection_field,300); + _INSTALL_MONITOR(generatorType_box,3000); + generatorType_box->setValueTrigger(1L,true); + _INSTALL_MONITOR(enabled_display,3000); + enabled_display->setValueTrigger(1L,true); + _INSTALL_MONITOR(correctionEnabled_display,3000); + correctionEnabled_display->setValueTrigger(1L,true); + _INSTALL_MONITOR(status_box,3000); + status_box->setValueTrigger(1L,true); + _INSTALL_MONITOR(FWHM_field,3000); + FWHM_field->setValueTrigger(0.001,true); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::NOTIFICATION_CHANNEL_SUBSCRIPTION")); + ACS_NEW_SIMPLE_CONSUMER(simpleConsumer,Antenna::AntennaDataBlock,Antenna::ANTENNA_DATA_CHANNEL, + NotificationHandler,static_cast(tracking_display)); + simpleConsumer->consumerReady(); + + /* ****************************************** */ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + + /* Add all the static labels */ + //_TW_ADD_LABEL(":",18,1,1,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Radial Velocity :",0,2,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Horiz. Offs :",0,3,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Equat. Offs :",0,4,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Galac. Offs :",0,5,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Raw Horiz. :",0,6,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Observed Horiz. :",0,7,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Observed Equat. :",0,8,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Observed Galac. :",0,9,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Generator Type : ",0,10,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Corr. az/el/ref : ",0,11,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("FWHM : ",0,12,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Enabled : ",0,13,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Tracking : ",0,14,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Correction : ",0,15,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Status : ",0,16,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL(" _______________________________Generator__________________________________________",0,17,WINDOW_WIDTH-2,1,CColorPair::GREEN_BLACK,CStyle::BOLD,window); + + /* ************************* */ + + /** Add all required association: components/Frame */ + window.addComponent((CFrameComponent*)target_field); + window.addComponent((CFrameComponent*)targetRA_field); + window.addComponent((CFrameComponent*)targetDec_field); + window.addComponent((CFrameComponent*)targetVrad_field); + window.addComponent((CFrameComponent*)refFrame_box); + window.addComponent((CFrameComponent*)velDef_box); + window.addComponent((CFrameComponent*)targetFlux_field); + window.addComponent((CFrameComponent*)azOff_field); + window.addComponent((CFrameComponent*)elOff_field); + window.addComponent((CFrameComponent*)raOff_field); + window.addComponent((CFrameComponent*)decOff_field); + window.addComponent((CFrameComponent*)lonOff_field); + window.addComponent((CFrameComponent*)latOff_field); + window.addComponent((CFrameComponent*)rawAzimuth_field); + window.addComponent((CFrameComponent*)rawElevation_field); + window.addComponent((CFrameComponent*)observedAzimuth_field); + window.addComponent((CFrameComponent*)observedElevation_field); + window.addComponent((CFrameComponent*)observedRightAscension_field); + window.addComponent((CFrameComponent*)observedDeclination_field); + window.addComponent((CFrameComponent*)observedGalLongitude_field); + window.addComponent((CFrameComponent*)observedGalLatitude_field); + window.addComponent((CFrameComponent*)generatorType_box); + window.addComponent((CFrameComponent*)enabled_display); + window.addComponent((CFrameComponent*)correctionEnabled_display); + window.addComponent((CFrameComponent*)pointingAzimuthCorrection_field); + window.addComponent((CFrameComponent*)pointingElevationCorrection_field); + window.addComponent((CFrameComponent*)refractionCorrection_field); + window.addComponent((CFrameComponent*)status_box); + window.addComponent((CFrameComponent*)tracking_display); + window.addComponent((CFrameComponent*)FWHM_field); + window.addComponent((CFrameComponent*)extraLabel1); + window.addComponent((CFrameComponent*)extraLabel2); + window.addComponent((CFrameComponent*)extraLabel3); + window.addComponent((CFrameComponent*)extraLabel4); + window.addComponent((CFrameComponent*)extraLabel5); + window.addComponent((CFrameComponent*)extraLabel6); + + /* ********************************************** */ + window.addComponent((CFrameComponent*)userInput); + #if USE_OUTPUT_FIELD >=1 + window.addComponent((CFrameComponent*)output_label); + #endif + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + // now it is possible to show the frame + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::START")); + + window.showFrame(); + + while(!terminate) { + //if ((fieldCounter=userInput->parseCommand(fields,MAXFIELDNUMBER))>0) { // there is something input + if (userInput->readCommand(inputCommand)) { + if (inputCommand=="exit") terminate=true; + else if (component->_is_a("IDL:alma/Management/CommandInterpreter:1.0")) { + try { + char * outputAnswer; + component->command((const char *)inputCommand,outputAnswer); + output_label->setValue(outputAnswer); + CORBA::string_free(outputAnswer); + output_label->Refresh(); + } + catch (CORBA::SystemException& ex) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"Main()"); + impl.setName(ex._name()); + impl.setMinor(ex.minor()); + IRA::CString Message; + _EXCPT_TO_CSTRING(Message,impl); + output_label->setValue(Message); + output_label->Refresh(); + impl.log(LM_ERROR); + } + catch(...) { + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,"Main()"); + impl.setAction("command()"); + impl.setReason("communication error to component server"); + IRA::CString Message; + _EXCPT_TO_CSTRING(Message,impl); + output_label->setValue(Message); + output_label->Refresh(); + impl.log(LM_ERROR); + } + } + else { + output_label->setValue("not enabled"); + output_label->Refresh(); + } + } + // automatic update of some controls. + updateGenerator(client,lastGeneratorType,lastGenerator); + //sleep for the required ammount of time + tv.set(0,MAINTHREADSLEEPTIME*1000); + client.run(tv); + } + + window.closeFrame(); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::RELEASING")); + goto CloseLabel; +ErrorLabel: + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::ABORTING")); +CloseLabel: + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::NOTIFICATION_CHANNEL_LOGGING_OUT")); + if (simpleConsumer!=NULL) simpleConsumer->disconnect(); + simpleConsumer=NULL; + window.Destroy(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_CLOSED")); + ACE_OS::sleep(1); + try { + if (!CORBA::is_nil(component.in())) { + client.releaseComponent(component->name()); + } + } + catch (maciErrType::CannotReleaseComponentExImpl& E) { + E.log(); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::COMPONENT_RELEASED")); + if (loggedIn) client.logout(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::SHUTTING_DOWN")); + signal(SIGINT,SIG_DFL); + ACE_OS::sleep(1); + return 0; +} diff --git a/Common/Clients/AntennaBossTextClient/src/Makefile b/Common/Clients/AntennaBossTextClient/src/Makefile new file mode 100644 index 000000000..61ae88472 --- /dev/null +++ b/Common/Clients/AntennaBossTextClient/src/Makefile @@ -0,0 +1,114 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.9 2011-06-21 16:40:54 a.orlati Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 07/02/08 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +USER_LIB = -lACE \ + -lbaci \ + -lmaci \ + -lmaciClient \ + -lTAO \ + -lTAO_DsLogAdmin \ + -lTAO_CosNaming \ + -lTAO_IORTable \ + -lTAO_PortableServer \ + -lTAO_Svc_Utils \ + -lTAO_CosTrading \ + -lTAO_CosNotification \ + -lTAO_DynamicAny \ + -lTAO_IFR_Client \ + -lTAO_CosProperty \ + -lacsutil \ + -lcdb \ + -llogging \ + -lacscomponent \ + -lacserr \ + -lm \ + -lloki \ + -lACSErrTypeCommon \ + -lncurses + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = _tui_AntennaBossTextClient +EXECUTABLES_L = + +# +# +_tui_AntennaBossTextClient_OBJECTS = AntennaBossTextClient +_tui_AntennaBossTextClient_LIBS = AntennaBossStubs IRALibrary \ + ManagmentDefinitionsStubs TextWindowLibrary ClientErrors ComponentErrors ManagementErrors \ + AntennaErrors AntennaDefinitionsStubs EphemGeneratorStubs SkySourceStubs OTFStubs MoonStubs acsnc + + +SCRIPTS = antennaBossTui + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Clients/AntennaBossTextClient/src/antennaBossTui b/Common/Clients/AntennaBossTextClient/src/antennaBossTui new file mode 100644 index 000000000..b9869d928 --- /dev/null +++ b/Common/Clients/AntennaBossTextClient/src/antennaBossTui @@ -0,0 +1,13 @@ +#! /bin/bash +# ********************************************************************************************* +# IRA Istituto di Radioastronomia +# "@(#) $Id: antennaBossTui,v 1.3 2010-08-10 09:36:14 a.orlati Exp $" +# +# This code is under GNU General Public Licence (GPL). +# +# Who when What +# Andrea Orlati(aorlati@ira.inaf.it) 08/05/2009 Creation +#************************************************************************ + + +xterm -geometry 82x32+334+0 +sb -title AntennaBoss -e /bin/bash --login -c _tui_AntennaBossTextClient & diff --git a/Common/Clients/AntennaBossTextClient/template/scanExample.scd b/Common/Clients/AntennaBossTextClient/template/scanExample.scd new file mode 100644 index 000000000..41c72bb81 --- /dev/null +++ b/Common/Clients/AntennaBossTextClient/template/scanExample.scd @@ -0,0 +1,12 @@ +#1) startLon (degrees) +#2) startLat (degrees) +#3) stopLon (degrees) +#4) stopLat (degrees) +#5) frame (EQ,HOR,GAL) +#6) subscanframe (EQ,HOR,GAL) +#7) geomtry (LON,LAT,GC) +#8) description (SS,CEN) +#9) direction (INC, DEC) +#10)duration (seconds) +0.32 43.0 0.32 48.0 EQ EQ LON SS INC 35.0 + diff --git a/Common/Clients/CaltoolClient/src/Makefile b/Common/Clients/CaltoolClient/src/Makefile new file mode 100644 index 000000000..e777a85fa --- /dev/null +++ b/Common/Clients/CaltoolClient/src/Makefile @@ -0,0 +1,214 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id$" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# spoppi 01/07/11 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +#USER_LIB = + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = +EXECUTABLES_L = + +# +# +xxxxx_OBJECTS = +xxxxx_LDFLAGS = +xxxxx_LIBS = + +# +# special compilation flags for single c sources +#yyyyy_CFLAGS = + +# +# Includes (.h) files (public only) +# --------------------------------- +INCLUDES = + +# +# Libraries (public and local) +# ---------------------------- +LIBRARIES = +LIBRARIES_L = + +# +# +lllll_OBJECTS = + +# +# Scripts (public and local) +# ---------------------------- +SCRIPTS = +SCRIPTS_L = + +# +# TCL scripts (public and local) +# ------------------------------ +TCL_SCRIPTS = +TCL_SCRIPTS_L = + +# +# Python stuff (public and local) +# ---------------------------- +PY_SCRIPTS = calibrationtoolclient +PY_SCRIPTS_L = + +PY_MODULES = customwidgets calibrationtool_ui +PY_MODULES_L = + +PY_PACKAGES = +PY_PACKAGES_L = +pppppp_MODULES = + +# +# +tttttt_OBJECTS = +tttttt_TCLSH = +tttttt_LIBS = + +# +# TCL libraries (public and local) +# ------------------------------ +TCL_LIBRARIES = +TCL_LIBRARIES_L = + +# +# +tttlll_OBJECTS = + +# +# Configuration Database Files +# ---------------------------- +CDB_SCHEMAS = + +# +# IDL Files and flags +# +IDL_FILES = +TAO_IDLFLAGS = +USER_IDL = +# +# Jarfiles and their directories +# +JARFILES= +jjj_DIRS= +jjj_EXTRAS= +# +# java sources in Jarfile on/off +DEBUG= +# +# ACS XmlIdl generation on/off +# +XML_IDL= +# +# Java Component Helper Classes generation on/off +# +COMPONENT_HELPERS= +# +# Java Entity Classes generation on/off +# +XSDBIND= +# +# Schema Config files for the above +# +XSDBIND_INCLUDE= +# man pages to be done +# -------------------- +MANSECTIONS = +MAN1 = +MAN3 = +MAN5 = +MAN7 = +MAN8 = + +# +# local man pages +# --------------- +MANl = + +# +# ASCII file to be converted into Framemaker-MIF +# -------------------- +ASCII_TO_MIF = + +# +# other files to be installed +#---------------------------- +INSTALL_FILES = + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: gui do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + @rm calibrationtool_ui.py + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + +gui: + pyuic4 calibrationToolClient.ui -o calibrationtool_ui.py + + @sed -ie 's/Qwt5.QwtPlot/PlotProperty/g' calibrationtool_ui.py + + @sed -ie '9 i\from customwidgets import *' calibrationtool_ui.py + +#___oOo___ diff --git a/Common/Clients/CaltoolClient/src/calibrationToolClient.ui b/Common/Clients/CaltoolClient/src/calibrationToolClient.ui new file mode 100644 index 000000000..5b6485182 --- /dev/null +++ b/Common/Clients/CaltoolClient/src/calibrationToolClient.ui @@ -0,0 +1,711 @@ + + + CalibrationToolDialog + + + + 0 + 0 + 954 + 572 + + + + Calibration Tool Client + + + + + 20 + 20 + 211 + 18 + + + + Project + + + Qt::AlignCenter + + + + + + 240 + 20 + 241 + 18 + + + + Observer + + + Qt::AlignCenter + + + + + + 500 + 20 + 391 + 18 + + + + Filename + + + Qt::AlignCenter + + + + + + 18 + 40 + 210 + 51 + + + + + + + 527 + 40 + 401 + 51 + + + + + + + 240 + 40 + 271 + 51 + + + + true + + + + + + 560 + 100 + 371 + 371 + + + + QFrame::Box + + + + + 0 + 0 + 408 + 351 + + + + + + + + 0 + 0 + + + + + 100 + 22 + + + + Name + + + + + + + + 94 + 22 + + + + + 150 + 26 + + + + true + + + + + + + + 100 + 22 + + + + Flux + + + + + + + + 94 + 22 + + + + + 150 + 26 + + + + true + + + + + + + + 100 + 22 + + + + Device Id + + + + + + + + 94 + 22 + + + + + 150 + 26 + + + + true + + + + + + + + 100 + 22 + + + + Scan Id + + + + + + + + 94 + 22 + + + + + 150 + 26 + + + + true + + + + + + + + 0 + 0 + + + + + 94 + 22 + + + + SubScan Id + + + + + + + + 94 + 22 + + + + + 150 + 26 + + + + true + + + + + + + + 100 + 22 + + + + HPBW(arcmim) + + + + + + + + 94 + 22 + + + + + 150 + 26 + + + + true + + + + + + + + 100 + 22 + + + + Amplitude (K) + + + + + + + + 94 + 22 + + + + + 150 + 26 + + + + true + + + + + + + + 100 + 22 + + + + PeakOffset(deg) + + + + + + + + 94 + 22 + + + + + 150 + 26 + + + + true + + + + + + + + 100 + 22 + + + + Slope + + + + + + + + 94 + 22 + + + + + 150 + 26 + + + + true + + + + + + + + 100 + 22 + + + + Offset (K) + + + + + + + + 0 + 0 + + + + + 94 + 22 + + + + + 150 + 26 + + + + true + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 150 + 16777215 + + + + OFF + + + Qt::AlignCenter + + + + + + + true + + + + 0 + 0 + + + + + 0 + 0 + + + + + 150 + 16777215 + + + + none + + + Qt::AlignCenter + + + + + + + Scan Axis + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + Recording + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + + + 20 + 100 + 541 + 431 + + + + QFrame::Box + + + QFrame::Plain + + + + + + Current Subscan + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 500 + 178 + + + + + 500 + 178 + + + + + + + + + 500 + 178 + + + + + 500 + 178 + + + + QFrame::NoFrame + + + + + + + Last Subscan + + + Qt::AlignCenter + + + + + + + + + 560 + 470 + 371 + 61 + + + + QFrame::Box + + + QFrame::Plain + + + + + 0 + 10 + 401 + 34 + + + + + 0 + 0 + + + + + + + Qt::RightToLeft + + + false + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + true + + + + + + + QwtPlot + QFrame +
qwt_plot.h
+
+
+ + + + buttonBox + accepted() + CalibrationToolDialog + accept() + + + 748 + 734 + + + 157 + 274 + + + + + buttonBox + rejected() + CalibrationToolDialog + reject() + + + 816 + 740 + + + 286 + 274 + + + + +
diff --git a/Common/Clients/CaltoolClient/src/calibrationtoolclient.py b/Common/Clients/CaltoolClient/src/calibrationtoolclient.py new file mode 100644 index 000000000..b8fa25551 --- /dev/null +++ b/Common/Clients/CaltoolClient/src/calibrationtoolclient.py @@ -0,0 +1,330 @@ +#! /usr/bin/env python +from Acspy.Clients.SimpleClient import PySimpleClient +import Acspy.Common.Err +import maciErrType +import maciErrTypeImpl +import ClientErrorsImpl +import ACSLog + + +import ACS, ACS__POA # Import the Python CORBA stubs for BACI +from PyQt4 import Qt +from PyQt4.QtCore import pyqtSlot,QThread,QMutex,QTimer +import PyQt4.Qwt5 as Qwt +import sys,getopt +from time import sleep +import math + + + +import calibrationtool_ui # file generated by pyuic4 but modified to include + #custom widgets. + +__version__ = '$Id' + + +''' +@version $Id$ +''' + + +class MyWorker(QThread): + def __init__(self,component,parent=None): + self.Mutex =QMutex() + QThread.__init__(self,parent) + self.caltool=component[0] + self.scheduler=component[1] + self.boss =component[2] + self.simpleClient=component[3] + self.run=True; + self.scanAxis = self.caltool._get_scanAxis() + + self.arrayDataY=self.caltool._get_arrayDataY() + self.arrayDataX=self.caltool._get_arrayDataX() + self.dataX=self.caltool._get_dataX() + self.dataY=self.caltool._get_dataY() + # self.datax_tmp=[0 for i in len(self_data)] + self.datay_tmp=[] + self.datax_tmp=[] + self.projectname=self.caltool._get_projectName() + self.observer =self.caltool._get_observer() + self.filename =self.caltool._get_fileName() + self.deviceID =self.caltool._get_deviceID() + self.subscan =self.scheduler._get_subScanID() + self.scan =self.scheduler._get_scanID() + self.hpbw =self.caltool._get_hpbw() + self.amplitude =self.caltool._get_amplitude() + self.peakOffset =self.caltool._get_peakOffset() + self.slope =self.caltool._get_slope() + self.offset =self.caltool._get_offset() + self.name =self.boss._get_target() + self.device =self.caltool._get_deviceID() + self.oldscan=0L + self.newscan=0L + self.oldsubscan=0L + self.newsubscan=0L + self.oldrecordingstatus=False + self.newrecordingstatus=False + + + + def run (self): + try: + +# arrayDataX=self.componenselft._get_arrayDataX() +# arrayDataY=self.component._get_arrayDataY() + while self.run: + (scanaxis,compl)=self.scanAxis.get_sync() + #self.scanAx + (arraydatax,compl)=self.arrayDataX.get_sync() + if 'SUBR' not in str(scanaxis): + arraydatax[:]=[x /math.pi*180. for x in arraydatax] + + + self.emit(Qt.SIGNAL("arrayDataX"),arraydatax) + (arraydatay,compl2)=self.arrayDataY.get_sync() + + self.emit(Qt.SIGNAL("arrayDataY"),arraydatay) + (datay,compl3)=self.dataY.get_sync() + (datax,compl3)=self.dataX.get_sync() + if 'SUBR' not in str(scanaxis): + + datax=datax/math.pi*180. + (projectname,compl4)=self.projectname.get_sync() + self.emit(Qt.SIGNAL("projectname"),projectname) + (observername,compl5)=self.observer.get_sync() + self.emit(Qt.SIGNAL("observer"),observername) + (filename,compl6)=self.filename.get_sync() + self.emit(Qt.SIGNAL("filename"),filename) + (subscanid,compl7)=self.subscan.get_sync() + self.emit(Qt.SIGNAL("subscan"),str(subscanid)) + (scanid,compl8)=self.scan.get_sync() + self.emit(Qt.SIGNAL("scan"),str(scanid)) + (hpbw,compl9)=self.hpbw.get_sync() + + if 'SUBR' not in str(scanaxis): + hpbw= hpbw/math.pi*180*60 + self.emit(Qt.SIGNAL("hpbw"),("%5.3f" % (hpbw))) + (amplitude,compl10)=self.amplitude.get_sync() + self.emit(Qt.SIGNAL("amplitude"),"%5.3f" % amplitude) + (peakOffset,compl11)=self.peakOffset.get_sync() + if 'SUBR' not in str(scanaxis): + peakOffset=peakOffset/math.pi*180 + + self.emit(Qt.SIGNAL("peakOffset"),"%5.3f" % (peakOffset)) + (slope,compl12)=self.slope.get_sync() + + self.emit(Qt.SIGNAL("slope"),"%5.3f" %slope) + (offset,compl13)=self.offset.get_sync() + self.emit(Qt.SIGNAL("offset"),"%5.3f" % offset) + (target,compl13)=self.name.get_sync() + self.emit(Qt.SIGNAL("target"),target) + (device,compl13)=self.device.get_sync() + self.emit(Qt.SIGNAL("device"),str(device)) + self.emit(Qt.SIGNAL("scanAxis"),scanaxis) + + rec= self.caltool.isRecording() + if rec==True: + self.datay_tmp.append(datay) + self.datax_tmp.append(datax) + self.emit(Qt.SIGNAL("DataY"),self.datay_tmp) + self.emit(Qt.SIGNAL("DataX"),self.datax_tmp) + + self.emit(Qt.SIGNAL("isRecording"),rec) + self.emit(Qt.SIGNAL("scanAxis"),scanaxis) + + # print rec +# if (subscanid!=self.oldsubscan and scanid !=self.oldscanid): +# print "scan changed",self.oldsubscan,subscanid +# self.oldsubscan=subscanid +# self.subscan=subscanid +# self.datax_tmp=[] +# self.datay_tmp=[] + + + if (rec!=self.oldrecordingstatus): + self.oldrecordingstatus=rec + self.datax_tmp=[] + self.datay_tmp=[] + + + + QThread.msleep(200) + print "Exited from thread" + + except Exception,ex: + newEx = ClientErrorsImpl.CouldntAccessPropertyExImpl(exception=ex, create=1) + newEx.setPropertyName("") + #ACS_LOG_ERROR + newEx.log(self.simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) + + self.run=False + + def __del__(self): + QThread.msleep(200) + pass + + + + + +class Application(Qt.QDialog,calibrationtool_ui.Ui_CalibrationToolDialog): + + def __init__(self,compname,parent=None): + Qt.QDialog.__init__(self) + + self.simpleClient = PySimpleClient() + try: + scheduler= self.simpleClient.getDefaultComponent("IDL:alma/Management/Scheduler:1.0") + antennaBoss =self.simpleClient.getDefaultComponent("IDL:alma/Antenna/AntennaBoss:1.0") + + #choose default recorder + if compname=='default': + + recorder=scheduler._get_currentRecorder() + (recordername,compl)=recorder.get_sync() + self.componentname=recordername + print recordername + else: + self.componentname=compname + print self.componentname + component= self.simpleClient.getComponent(self.componentname) + self.thread=MyWorker([component,scheduler,antennaBoss,self.simpleClient]) + self.setupUi(self) +# self.qwtPlot_datax.setAxisScale(Qwt.QwtPlot.xBottom, 0,1000) + self.qwtPlot_datax.setAxisAutoScale(Qwt.QwtPlot. yLeft) + self.setWindowTitle(self.componentname) + self.qwtPlot_datax.setAxisTitle(Qwt.QwtPlot.yLeft, "Ta(K)") + self.qwtPlot_datay.setAxisTitle(Qwt.QwtPlot.yLeft, "Ta(K)") + + + + + + self.connect(self.thread,Qt.SIGNAL("arrayDataX"),self.qwtPlot_datay.setX) + self.connect(self.thread,Qt.SIGNAL("arrayDataY"),self.qwtPlot_datay.setVal) + + self.connect(self.thread,Qt.SIGNAL("DataX"),self.qwtPlot_datax.setX) + self.connect(self.thread,Qt.SIGNAL("DataY"),self.qwtPlot_datax.setVal) + + self.connect(self.thread,Qt.SIGNAL("projectname"),self.plainTextEdit_project.setPlainText) + self.connect(self.thread,Qt.SIGNAL("observer"),self.plainTextEdit_observer.setPlainText) + self.connect(self.thread,Qt.SIGNAL("filename"),self.plainTextEdit_filename.setPlainText) + self.connect(self.thread,Qt.SIGNAL("subscan"),self.subscanIdLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("scan"),self.scanIdLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("hpbw"),self.hpbwLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("amplitude"),self.amplitudeLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("peakOffset"),self.peakoffsetLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("slope"),self.slopeLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("offset"),self.offsetLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("target"),self.nameLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("device"),self.deviceIdLineEdit.setText) + self.connect(self.thread,Qt.SIGNAL("isRecording"),self.isRecording) + self.connect(self.thread,Qt.SIGNAL("scanAxis"),self.scanAxis) + + + + except Exception,ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl(exception=ex, create=1) +# newEx.setComponentName(self.componentname) + #ACS_LOG_ERROR + newEx.log(self.simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) + self.simpleClient.disconnect() + sys.exit(-1) + + @pyqtSlot(Qt.QObject,name="isRecording") + def isRecording(self,rec): + if rec==False: + self.recording.setText("OFF") + palette = self.recording.palette() + role = self.recording.backgroundRole() + palette.setColor(role, Qt.QColor('gray')) + self.recording.setPalette(palette) + self.BScanaxis.setEnabled(False) + + + + if rec==True: + self.recording.setText("ON") + palette = self.recording.palette() + role = self.recording.backgroundRole() + palette.setColor(role, Qt.QColor('green')) + self.recording.setPalette(palette) + self.BScanaxis.setEnabled(True) + + @pyqtSlot(Qt.QObject,name="scanAxis") # decorator for the slot + def scanAxis(self,scanaxis): + self.BScanaxis.setText(str(scanaxis)) + + if 'SUBR' not in str(scanaxis): + self.scanAxisLabel.setText('ScanAxis - Pointing') + xaxis_text="Direction (Deg)" + hpbw_label_text='HPBW(arcmim)' + peakOffsetLabel_text='PeakOffset(deg)' + else: + self.scanAxisLabel.setText('ScanAxis - Focus') + xaxis_text="Distance (mm)" + hpbw_label_text='HPBW(mm)' + + peakOffsetLabel_text='PeakOffset(mm)' + + self.qwtPlot_datax.setAxisTitle(Qwt.QwtPlot.xBottom, xaxis_text) + self.qwtPlot_datay.setAxisTitle(Qwt.QwtPlot.xBottom, xaxis_text) + self.hpbw_label.setText(hpbw_label_text) + self.peakOffsetLabel.setText(peakOffsetLabel_text) + + + + @pyqtSlot(Qt.QObject,name="scalePlots") # decorator for the slot + def scalePlots(self,val): + self.qwtPlot_datay.setAxisScale(QwtPlot.xBottom, min(val), max(val)) + def run(self): + self.thread.start() + + def __del__(self): + self.thread.run=False + try: + self.simpleClient.releaseComponent(self.componentname) + self.simpleClient.disconnect() + except Exception,ex: + print "exception" + + print "end app" + + +def usage(nameapp): + print nameapp+" [component name]" + + + + + + +def main(args): + try: + opts, args = getopt.getopt(sys.argv[1:],"h",["help"]) + except getopt.GetoptError, err: + print str(err) + usage() + sys.exit(1) + + for o,a in opts: + if o in ("-h", "--help"): + usage() + sys.exit() + + if len(args)==0: + componentname='default' + else: + componentname=args[0] + + print componentname + app = Qt.QApplication(args) + a=Application(componentname) #passa il nome del component al costruttore + a.run() + p=a.show() + + sys.exit(app.exec_()) + sleep(2) +if __name__=='__main__': + main(sys.argv) diff --git a/Common/Clients/CaltoolClient/src/customwidgets.py b/Common/Clients/CaltoolClient/src/customwidgets.py new file mode 100644 index 000000000..8eeb8e3af --- /dev/null +++ b/Common/Clients/CaltoolClient/src/customwidgets.py @@ -0,0 +1,80 @@ +from PyQt4 import Qt +from PyQt4.QtCore import pyqtSlot,QThread +import PyQt4.Qwt5 as Qwt +''' +Custom widgets classes. + + The file generated by the compilation of the .ui file with pyuic4 + must be changed. + For example, in the calibrationtool_ui.py the self.qwtPlot_datax widget + must inherit from PlotProperty class instead of its parent QwtPlot. + The output of compilation of the .ui file thus must be changed accordingly. + + ''' + + + + +class PlotProperty(Qwt.QwtPlot): + + def __init__(self,parent,*args): + Qwt.QwtPlot.__init__(self,parent,*args) + #self.paint=Qt.QPainter(self) # you must initialize the superclass + self.timeData= [i for i in range (1000)] + self.y=[] + self.curve=Qwt.QwtPlotCurve('aaaa') + self.curve.attach(self) + p = Qt.QPalette() # + p.setColor(self.backgroundRole(), Qt.QColor(30, 30, 50)) + self.setPalette(p) + self.curve.setPen(Qt.QPen(Qt.Qt.red)) + + + +#void Widget::drawCanvas(QPainter* p) +#{ +# QwtPlot::drawCanvas( p ); // <<--- + +# QStaticText txt("number"); +# p->drawStaticText ( 0, 0, txt); +#} + + def suspend(self): + pass + @pyqtSlot(Qt.QObject,name="setval") # decorator for the slot + # Qt.Object is necessary for lists + # and dictionarys + def setVal(self,val): + value_decimated=[0 for i in range (len(val))] + + step=len(val)/1000. + if step<1: + step=1 #step 0 not allowed + for i in range(0,min(len(val),1000)): + value_decimated[int(i)] =val[int(i*step-1)] +# self.curve.setData(self.timeData,value_decimated) + self.curve.setData(self.timeData,val) + self.replot() + @pyqtSlot(Qt.QObject,name="setX") # decorator for the slot + + def setX(self,val): + self.timeData=[i for i in val] + def setDataY(self,val): + value_decimated=[0 for i in range (1000)] + + step=len(val)/1000. + if step<1: + step=1 #step 0 not allowed + for i in range(0,min(len(val),1000)): + value_decimated[int(i)] =val[int(i*step)-1] +# self.curve.setData(self.timeData,value_decimated) + self.curve.setData(self.timeData,val) + + self.replot() + def setDataX(self,val): + pass + def setCurveColor(self,val): + pass + def __del__(self): +# self.actMonwspeed.destroy() + print "The end __oOo__" diff --git a/Common/Clients/CustomLoggingClient/src/Makefile b/Common/Clients/CustomLoggingClient/src/Makefile new file mode 100644 index 000000000..5f6fe7daf --- /dev/null +++ b/Common/Clients/CustomLoggingClient/src/Makefile @@ -0,0 +1,207 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id$" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# spoppi 01/07/11 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +#USER_LIB = + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = +EXECUTABLES_L = + +# +# +xxxxx_OBJECTS = +xxxxx_LDFLAGS = +xxxxx_LIBS = + +# +# special compilation flags for single c sources +#yyyyy_CFLAGS = + +# +# Includes (.h) files (public only) +# --------------------------------- +INCLUDES = + +# +# Libraries (public and local) +# ---------------------------- +LIBRARIES = +LIBRARIES_L = + +# +# +lllll_OBJECTS = + +# +# Scripts (public and local) +# ---------------------------- +SCRIPTS = loggingDisplay +SCRIPTS_L = + +# +# TCL scripts (public and local) +# ------------------------------ +TCL_SCRIPTS = +TCL_SCRIPTS_L = + +# +# Python stuff (public and local) +# ---------------------------- +PY_SCRIPTS = _gui_customLoggingClient +PY_SCRIPTS_L = + +PY_MODULES = +PY_MODULES_L = + +PY_PACKAGES = +PY_PACKAGES_L = +pppppp_MODULES = + +# +# +tttttt_OBJECTS = +tttttt_TCLSH = +tttttt_LIBS = + +# +# TCL libraries (public and local) +# ------------------------------ +TCL_LIBRARIES = +TCL_LIBRARIES_L = + +# +# +tttlll_OBJECTS = + +# +# Configuration Database Files +# ---------------------------- +CDB_SCHEMAS = + +# +# IDL Files and flags +# +IDL_FILES = +TAO_IDLFLAGS = +USER_IDL = +# +# Jarfiles and their directories +# +JARFILES= +jjj_DIRS= +jjj_EXTRAS= +# +# java sources in Jarfile on/off +DEBUG= +# +# ACS XmlIdl generation on/off +# +XML_IDL= +# +# Java Component Helper Classes generation on/off +# +COMPONENT_HELPERS= +# +# Java Entity Classes generation on/off +# +XSDBIND= +# +# Schema Config files for the above +# +XSDBIND_INCLUDE= +# man pages to be done +# -------------------- +MANSECTIONS = +MAN1 = +MAN3 = +MAN5 = +MAN7 = +MAN8 = + +# +# local man pages +# --------------- +MANl = + +# +# ASCII file to be converted into Framemaker-MIF +# -------------------- +ASCII_TO_MIF = + +# +# other files to be installed +#---------------------------- +INSTALL_FILES = + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Clients/CustomLoggingClient/src/_gui_customLoggingClient.py b/Common/Clients/CustomLoggingClient/src/_gui_customLoggingClient.py new file mode 100755 index 000000000..2ac92464c --- /dev/null +++ b/Common/Clients/CustomLoggingClient/src/_gui_customLoggingClient.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python +""" +CustomLoggingClient implements a Tkinter interface that monitors in realtime the ACS custom +logging events generated runtime. +@TODO: implement window scrolling and window resize + +""" +import acscommon +import Management +from Acspy.Nc.Consumer import Consumer +import signal +import sys +import logging +import bisect +import functools +import Tkinter as tk +from IRAPy.bsqueue import BoundedSortedQueue + +#DEFINE LOGGING RECORDS TOTAL ORDERING RULES +Management.CustomLoggingData.__eq__ = lambda self, other: self.timeStamp == other.timeStamp +Management.CustomLoggingData.__ne__ = lambda self, other: self.timeStamp != other.timeStamp +Management.CustomLoggingData.__lt__ = lambda self, other: self.timeStamp < other.timeStamp +Management.CustomLoggingData.__le__ = lambda self, other: self.timeStamp <= other.timeStamp +Management.CustomLoggingData.__gt__ = lambda self, other: self.timeStamp > other.timeStamp +Management.CustomLoggingData.__ge__ = lambda self, other: self.timeStamp >= other.timeStamp +#DEFINE LOGGING RECORDS STRING REPRESENTATION +Management.CustomLoggingData.__repr__ = lambda self: self.msg + +# Maximum size for log messages display +""" +The number of logging events kept in memory +""" +MAX_QUEUE_SIZE = 200 + +""" +The number of logging events displayed in the window +""" +MAX_WINDOW_SIZE = 30 + +class App: + """Tkinter GUI application + """ + def __init__(self, master): + """Constructor.""" + self.record_list = BoundedSortedQueue(max_size=MAX_QUEUE_SIZE) + frame = master + self.yscrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL) + self.yscrollbar.pack(side=tk.RIGHT, fill=tk.Y) + self.list_box = tk.Listbox(frame, + width=160, + height=MAX_WINDOW_SIZE, + yscrollcommand=self.yscrollbar.set) + self.clear_button = tk.Button(frame, text="clear", command=self.clear) + self.clear_button.pack(side=tk.BOTTOM, anchor=tk.SW) + self.list_box.pack(expand=True, side=tk.LEFT, fill=tk.BOTH) + self.yscrollbar.config(command=self.list_box.yview) + + def handler(self, event): + """ + Handle a log_event adding it to a BoundedSortedQueue in memory and to the + corresponding GUI representation (in Tkinter this sould be a Listbox). + @param event: the logging event. + """ + index, popped = self.record_list.push(event) + if popped: + self.list_box.delete(0) + self.list_box.insert(index, event.msg) + self.list_box.yview(tk.END) # Listbox autoscroll + + def clear(self): + """Empty the event list.""" + self.record_list.clear() + self.list_box.delete(0, self.list_box.size()) + +if __name__ == '__main__': + from IRAPy import logger + try: + root = tk.Tk() + root.wm_title("ACS custom logging client") + root.resizable(tk.YES, tk.YES) + app = App(root) + consumer = Consumer(Management.CUSTOM_LOGGING_CHANNEL_NAME) + consumer.addSubscription(Management.CustomLoggingData, app.handler) + consumer.consumerReady() + except Exception, ex: + print "exception caught: ", ex #TODO: throw excep + logger.logError(ex.message) + #try: + + def handle_signal(num, trace): + #trace.f_locals['app'].clear() + #trace.f_locals['consumer'].disconnect() + print "Exiting" + sys.exit(0) + + signal.signal(signal.SIGINT, handle_signal) + signal.signal(signal.SIGUSR1, handle_signal) + root.mainloop() + #except KeyboardInterrupt, ki: + # pass + #finally: + # consumer.disconnect() + # print "Exiting" diff --git a/Common/Clients/CustomLoggingClient/src/loggingDisplay b/Common/Clients/CustomLoggingClient/src/loggingDisplay new file mode 100644 index 000000000..caab96e9e --- /dev/null +++ b/Common/Clients/CustomLoggingClient/src/loggingDisplay @@ -0,0 +1,2 @@ +#! /bin/bash +_gui_customLoggingClient & \ No newline at end of file diff --git a/Common/Clients/GenericBackendTextClient/include/BackendClient.h b/Common/Clients/GenericBackendTextClient/include/BackendClient.h new file mode 100644 index 000000000..9e2a1fcd0 --- /dev/null +++ b/Common/Clients/GenericBackendTextClient/include/BackendClient.h @@ -0,0 +1,98 @@ +#ifndef COMPONENTTEXTCLIENTTEMPLATE_H +#define COMPONENTTEXTCLIENTTEMPLATE_H + +/* **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* $id$ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ + +// quick guide: when needed, fill in all the parts bounded by * + +/* Add the component skeleton header file */ +/* ************************************* */ +#include +/* ************************************* */ + +/* Add the component errors header file */ +/* ************************************* */ +#include +#include +/* ************************************* */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define GRAY_COLOR 0 +#define BLUE_GRAY 0 +#define GRAY_BLUE 1 +#define BLACK_RED 2 +#define BLACK_GREEN 3 +#define BLACK_YELLOW 4 +#define BLACK_BLUE 5 +#define BLACK_MAGENTA 6 +#define BLACK_WHITE 7 + +/* define the max number of arguments that can be passed to component methods */ +/* ************************************************************************** */ +#define MAXFIELDNUMBER 10 +/* ************************************************************************** */ + +/* define the main frame dimension */ +/* ******************************* */ +#define WINDOW_WIDTH 101 /*columns */ +#define WINDOW_HEIGHT 28 /* rows */ +/* ******************************* */ + +/* define the routine name here, to be used for logging */ +/* **************************************************** */ +#define MODULE_NAME "genericBackendTui" /* the name of this module (filename without .cpp) */ +/* **************************************************** */ + +/* define the application title and style */ +/* ************************************* */ +#define APPLICATION_TITLE "GenericBackend" /* the title of the main frame */ +#define TITLE_COLOR_PAIR CColorPair::RED_BLACK /* the title color and background */ +#define TITLE_STYLE CStyle::BOLD|CStyle::UNDERLINE /* the title style */ +/* ************************************* */ + +/* define name and component interface */ +/* ********************************** */ +//#define COMPONENT_NAME "BACKENDS/TotalPower" /* the name of the istantiation of the component */ +#define COMPONENT_IDL_MODULE Backends /* the IDL module that contains the component interface */ +#define COMPONENT_IDL_INTERFACE GenericBackend /* the IDL interface of the component */ +#define COMPONENT_SMARTPOINTER GenericBackend_var /* the component type */ +/* ********************************** */ + +/* define user input command style */ +/* ******************************* */ +#define USER_INPUT_COLOR_PAIR BLUE_GRAY /* user input color and background */ +#define USER_INPUT_STYLE CStyle::NORMAL /* user input style */ +/* ******************************* */ + +/* define output field look and feel */ +/* ********************************* */ +#define USE_OUTPUT_FIELD 1 /* 0 disable the output field */ +#define OUTPUT_FIELD_COLOR_PAIR GRAY_BLUE /* output field color and background */ +#define OUTPUT_FIELD_STYLE CStyle::NORMAL /* output field style */ +#define OUTPUT_FIELD_HEIGHT 4 /* output field height (number of rows) */ +/* ********************************* */ + +/* define this value (milliseconds) to set the log guard interval */ +#define GUARDINTERVAL 1000 +/* to send the client to sleep for a certain ammount of time, setup this value (milliseconds) */ +#define MAINTHREADSLEEPTIME 250 + +#endif diff --git a/Common/Clients/GenericBackendTextClient/src/BackendClient.cpp b/Common/Clients/GenericBackendTextClient/src/BackendClient.cpp new file mode 100644 index 000000000..449994f68 --- /dev/null +++ b/Common/Clients/GenericBackendTextClient/src/BackendClient.cpp @@ -0,0 +1,541 @@ + +#include "BackendClient.h" +#include + +#define _GET_ACS_PROPERTY(TYPE,NAME) TYPE##_var NAME; \ +{ \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,"Trying to get property "#NAME"...")); \ + NAME=component->NAME(); \ + if (NAME.ptr()!=TYPE::_nil()) { \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %x",NAME.ptr())); \ + } \ + else { \ + _EXCPT(ClientErrors::CouldntAccessPropertyExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setPropertyName(#NAME); \ + impl.log(); \ + goto ErrorLabel; \ + } \ +} + +#define _INSTALL_MONITOR(COMP,TRIGGERTIME) { \ + if (!COMP->installAutomaticMonitor(GUARDINTERVAL)) { \ + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setAction("Install monitor"); \ + impl.setReason((const char*)COMP->getLastError()); \ + impl.log(); \ + ACE_OS::sleep(1); \ + goto ErrorLabel; \ + } \ + COMP->setTriggerTime(TRIGGERTIME); \ +} + +#define _GET_PROPERTY_VALUE_ONCE(TYPE,FORMAT,PROPERTY,PROPERTNAME,CONTROL) { \ + try { \ + TYPE temp; \ + ACSErr::Completion_var cmpl; \ + temp=PROPERTY->get_sync(cmpl.out()); \ + CompletionImpl cmplImpl(cmpl.in()); \ + if (cmplImpl.isErrorFree()) { \ + IRA::CString val(0,FORMAT,temp); \ + CONTROL->setValue(val); \ + CONTROL->Refresh(); \ + } \ + else { \ + _ADD_BACKTRACE(ClientErrors::CouldntAccessPropertyExImpl,impl,cmplImpl,"::Main()"); \ + impl.setPropertyName(PROPERTNAME); \ + impl.log(); \ + goto ErrorLabel; \ + } \ + } \ + catch (...) { \ + _EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); \ + impl.log(); \ + goto ErrorLabel; \ + } \ +} + +/*#define _CATCH_ALL(OUTPUT,ROUTINE,COMP_EXCEPTION) \ + catch (COMP_EXCEPTION &E) { \ + _ADD_BACKTRACE(ClientErrors::CouldntPerformActionExImpl,impl,E,ROUTINE); \ + IRA::CString Message; \ + if (OUTPUT!=NULL) { \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } \ + catch (ComponentErrors::ComponentErrorsEx &E) { \ + _ADD_BACKTRACE(ClientErrors::CouldntPerformActionExImpl,impl,E,ROUTINE); \ + IRA::CString Message; \ + if (OUTPUT!=NULL) { \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } \ + catch (CORBA::SystemException &C) { \ + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,ROUTINE); \ + impl.setName(C._name()); \ + impl.setMinor(C.minor()); \ + if (OUTPUT!=NULL) { \ + IRA::CString Message; \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } \ + catch (...) { \ + _EXCPT(ClientErrors::UnknownExImpl,impl,ROUTINE); \ + if (OUTPUT!=NULL) { \ + IRA::CString Message; \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + }*/ + +#define COMPONENT_INTERFACE COMPONENT_IDL_MODULE::COMPONENT_IDL_INTERFACE +#define COMPONENT_DECLARATION COMPONENT_IDL_MODULE::COMPONENT_SMARTPOINTER + +#define MAX_NUM_INPUTS 19 +#define MAX_NUM_SECTIONS 19 + +#define TEMPLATE_4_ROTBOOLEAN Management::ROTBoolean_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var + +using namespace TW; + +static bool terminate; + +void quintHandler(int sig) +{ + terminate=true; +} + +IRA::CString tsysFormat(const baci::BACIValue& value,const void* arg) +{ + IRA::CString formatted=""; + baci::BACIValue::Type currentType=value.getType(); + if ((currentType==baci::BACIValue::type_double)) { + double app; + app=value.doubleValue(); + if (app<0) formatted="??????"; + else if (app>999.0) formatted="??????"; + else { + formatted.Format("%06.1lf",app); + } + } + else { + formatted="??????"; + } + return formatted; +} + +IRA::CString polarizationFormat(const baci::BACIValue& value,const void* arg) +{ + if (value.longValue()==Backends::BKND_LCP) { + return IRA::CString("LEFT-"); + } + else if (value.longValue()==Backends::BKND_RCP) { + return IRA::CString("RIGHT"); + } + else { + return IRA::CString("FULL-"); + } +} + +int main(int argc, char *argv[]) { + bool loggedIn=false; + maci::SimpleClient client; + ACE_Time_Value tv(1); + char spaces6Float[20],spaces4Float[20],sNotation[20],spaces5Int[20],spaces2Int[20]; + char COMPONENT_NAME[256]; + IRA::CString appTitle(APPLICATION_TITLE); + IRA::CString inputCommand; + + // Component declaration + COMPONENT_DECLARATION component=COMPONENT_INTERFACE::_nil(); + + /* Add notification channels declaration */ + //nc::SimpleConsumer *simpleConsumer=NULL; + /* ************************************* */ + + /* Add frame controls declaration */ + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(uLongLong)> *time_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)> *inputs_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)> *sections_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)> *integration_field; + TW::CPropertyBitField<_TW_PROPERTYCOMPONENT_T_RO(pattern)> * status_bits; + TW::CPropertyLedDisplay * busy_display; + TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)> *attenuation_text; + TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)> *sampleRate_text; + TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)> *bandWidth_text; + TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)> *frequency_text; + TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(long)> *inputSection_text; + TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)> *tsys_text; + TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(long)> *pol_text; + TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(long)> *bins_text; + TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(long)> *feed_text; + + /* ******************************* */ + TW::CLabel *output_label; + TW::CInputCommand *userInput; + + terminate=false; + + // mainframe + TW::CFrame window(CPoint(0,0),CPoint(WINDOW_WIDTH,WINDOW_HEIGHT),'|','|','-','-'); + + // disable ctrl+C + signal(SIGINT,SIG_IGN); + signal(SIGUSR1,quintHandler); + + strcpy(spaces6Float,"%06.1lf"); + strcpy(spaces4Float,"%04.1lf"); + strcpy(sNotation,"%08.5le"); + strcpy(spaces5Int,"%05ld"); + strcpy(spaces2Int,"%02ld"); + + if (argc<2) { + printf("The name of the instance must be provided as command line argument\n"); + return -1; + } + strcpy(COMPONENT_NAME,argv[1]); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MANAGER_LOGGING")); + try { + if (client.init(argc,argv)==0) { + _EXCPT(ClientErrors::CouldntInitExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + else { + if (client.login()==0) { + _EXCPT(ClientErrors::CouldntLoginExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + loggedIn=true; + } + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + // Window initialization + window.initFrame(); + + appTitle+=": "; + appTitle+=COMPONENT_NAME; + window.setTitle(appTitle); + // Change the style of the main frame + window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); + + if (window.colorReady()) { + window.defineColor(GRAY_COLOR,255,255,255); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); + window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); + } + else { + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_COMPONENENT: %s",COMPONENT_NAME)); + try { + component=client.getComponent(COMPONENT_NAME,0,true); + if (CORBA::is_nil(component.in())==true) { + _EXCPT(ClientErrors::CouldntAccessComponentExImpl,impl,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_NAME); + impl.log(); + goto ErrorLabel; + } + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch (maciErrType::CannotGetComponentExImpl& E) { + _ADD_BACKTRACE(ClientErrors::CouldntAccessComponentExImpl,impl,E,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_NAME); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %d",component.ptr())); + ACE_OS::sleep(1); + try { + /* Add all component properties here */ + _GET_ACS_PROPERTY(ACS::ROuLongLong,time); + _GET_ACS_PROPERTY(ACS::ROlong,inputsNumber); + _GET_ACS_PROPERTY(ACS::ROlong,sectionsNumber); + _GET_ACS_PROPERTY(ACS::ROlong,integration); + _GET_ACS_PROPERTY(ACS::ROpattern,status); + _GET_ACS_PROPERTY(Management::ROTBoolean,busy); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,attenuation); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,bandWidth); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,frequency); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,sampleRate); + _GET_ACS_PROPERTY(ACS::ROlongSeq,polarization); + _GET_ACS_PROPERTY(ACS::ROlongSeq,bins); + _GET_ACS_PROPERTY(ACS::ROlongSeq,feed); + _GET_ACS_PROPERTY(ACS::ROlongSeq,inputSection); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,systemTemperature) + + /* ********************************* */ + ACE_OS::sleep(1); + + /** Frame controls creation */ + time_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(uLongLong)>(time.in()); + inputs_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)>(inputsNumber.in()); + sections_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)>(sectionsNumber.in()); + integration_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)>(integration.in()); + busy_display=new TW::CPropertyLedDisplay(busy.in(),1); + status_bits=new TW::CPropertyBitField<_TW_PROPERTYCOMPONENT_T_RO(pattern)>(status.in()); + attenuation_text=new TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)>(attenuation.in()); + sampleRate_text=new TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)>(sampleRate.in()); + bandWidth_text=new TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)>(bandWidth.in()); + frequency_text=new TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)>(frequency.in()); + pol_text=new TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(long)>(polarization.in()); + bins_text=new TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(long)>(bins.in()); + tsys_text=new TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)>(systemTemperature.in()); + inputSection_text=new TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(long)>(inputSection.in()); + feed_text=new TW::CPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(long)>(feed.in()); + + /* ************************ */ + #if USE_OUTPUT_FIELD >=1 + output_label=new TW::CLabel(""); + #else + output_label=NULL; + #endif + userInput=new TW::CInputCommand(); + + /** setting up the properties of the components of the frame controls */ + _TW_SET_COMPONENT(time_field,11,0,22,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(inputs_field,63,1,8,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(sections_field,11,1,8,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(integration_field,48,0,8,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + + _TW_SET_COMPONENT(frequency_text,5,3,7,MAX_NUM_SECTIONS,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(bandWidth_text,13,3,7,MAX_NUM_SECTIONS,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(feed_text,21,3,3,MAX_NUM_SECTIONS,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(sampleRate_text,26,3,12,MAX_NUM_SECTIONS,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(pol_text,39,3,6,MAX_NUM_SECTIONS,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(bins_text,45,3,6,MAX_NUM_SECTIONS,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + + _TW_SET_COMPONENT(status_bits,76,0,22,WINDOW_HEIGHT-7,CColorPair::WHITE_BLACK,CStyle::NORMAL,output_label); + + _TW_SET_COMPONENT(attenuation_text,56,3,5,MAX_NUM_INPUTS,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(inputSection_text,62,3,3,MAX_NUM_INPUTS,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(tsys_text,67,3,7,MAX_NUM_INPUTS,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + + time_field->setFormatFunction(CFormatFunctions::dateTimeClockFormat,NULL); + busy_display->setPosition(CPoint(68,0)); + busy_display->setOrientation(TW::CPropertyLedDisplay::HORIZONTAL); + busy_display->setOutputComponent((CFrameComponent*) output_label); + busy_display->setLedStyle(0,TW::CStyle(CColorPair::WHITE_BLACK,0),TW::CStyle(CColorPair::YELLOW_BLACK,0),'O','@'); + attenuation_text->setHAlign(CFrameComponent::UP); + sampleRate_text->setHAlign(CFrameComponent::UP); + frequency_text->setHAlign(CFrameComponent::UP); + bandWidth_text->setHAlign(CFrameComponent::UP); + pol_text->setHAlign(CFrameComponent::UP); + bins_text->setHAlign(CFrameComponent::UP); + inputSection_text->setHAlign(CFrameComponent::UP); + tsys_text->setHAlign(CFrameComponent::UP); + feed_text->setHAlign(CFrameComponent::UP); + attenuation_text->setFormatFunction(CFormatFunctions::floatingPointFormat,static_cast(spaces4Float)); + sampleRate_text->setFormatFunction(CFormatFunctions::floatingPointFormat,static_cast(sNotation)); + frequency_text->setFormatFunction(CFormatFunctions::floatingPointFormat,static_cast(spaces6Float)); + bandWidth_text->setFormatFunction(CFormatFunctions::floatingPointFormat,static_cast(spaces6Float)); + inputSection_text->setFormatFunction(CFormatFunctions::integerFormat,static_cast(spaces2Int)); + feed_text->setFormatFunction(CFormatFunctions::integerFormat,static_cast(spaces2Int)); + tsys_text->setFormatFunction(tsysFormat,NULL); + pol_text->setFormatFunction(polarizationFormat,NULL); + bins_text->setFormatFunction(CFormatFunctions::integerFormat,static_cast(spaces5Int)); + + + /* ****************************************************************** */ + _TW_SET_COMPONENT(userInput,0,WINDOW_HEIGHT-6,WINDOW_WIDTH-1,1,USER_INPUT_COLOR_PAIR,USER_INPUT_STYLE,NULL); + #if USE_OUTPUT_FIELD >=1 + _TW_SET_COMPONENT(output_label,0,WINDOW_HEIGHT-(OUTPUT_FIELD_HEIGHT+1),WINDOW_WIDTH-1,OUTPUT_FIELD_HEIGHT,OUTPUT_FIELD_COLOR_PAIR,OUTPUT_FIELD_STYLE,NULL); + #endif + + // Monitors + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MONITORS_INSTALLATION")); + /** Add all required monitor installation here */ + _INSTALL_MONITOR(time_field,200); + _INSTALL_MONITOR(inputs_field,500); + _INSTALL_MONITOR(sections_field,500); + _INSTALL_MONITOR(integration_field,200); + _INSTALL_MONITOR(status_bits,200); + _INSTALL_MONITOR(attenuation_text,800); + _INSTALL_MONITOR(sampleRate_text,800); + _INSTALL_MONITOR(bandWidth_text,800); + _INSTALL_MONITOR(frequency_text,800); + _INSTALL_MONITOR(pol_text,800); + _INSTALL_MONITOR(bins_text,800); + _INSTALL_MONITOR(feed_text,800); + _INSTALL_MONITOR(busy_display,3000); + _INSTALL_MONITOR(inputSection_text,800); + _INSTALL_MONITOR(tsys_text,800); + busy_display->setValueTrigger(1L,true); + + /* ****************************************** */ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + + /* Add all the static labels */ + IRA::CString labelCaption; + _TW_ADD_LABEL("Time :",0,0,10,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Integration :",34,0,13,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Busy :",57,0,10,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Sections :",0,1,10,1,CColorPair::BLUE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Inputs :",52,1,10,1,CColorPair::BLUE_BLACK,CStyle::UNDERLINE,window); + for (int jj=0;jj=1 + window.addComponent((CFrameComponent*)output_label); + #endif + + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + // now it is possible to show the frame + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::START")); + window.showFrame(); + while(!terminate) { + if (userInput->readCommand(inputCommand)) { + if (inputCommand=="exit") terminate=true; + else if (component->_is_a("IDL:alma/Management/CommandInterpreter:1.0")) { + try { + char * outputAnswer; + component->command((const char *)inputCommand,outputAnswer); + output_label->setValue(outputAnswer); + CORBA::string_free(outputAnswer); + output_label->Refresh(); + } + catch (CORBA::SystemException& ex) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"Main()"); + impl.setName(ex._name()); + impl.setMinor(ex.minor()); + IRA::CString Message; + _EXCPT_TO_CSTRING(Message,impl); + output_label->setValue(Message); + output_label->Refresh(); + impl.log(LM_ERROR); + } + catch(...) { + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,"Main()"); + impl.setAction("command()"); + impl.setReason("communication error to component server"); + IRA::CString Message; + _EXCPT_TO_CSTRING(Message,impl); + output_label->setValue(Message); + output_label->Refresh(); + impl.log(LM_ERROR); + } + } + else { + output_label->setValue("not enabled"); + output_label->Refresh(); + } + } + client.run(tv); + tv.set(0,MAINTHREADSLEEPTIME*1000); + } + + window.closeFrame(); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::RELEASING")); + goto CloseLabel; +ErrorLabel: + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::ABORTING")); +CloseLabel: + /* Instructions to free the notification channel */ + // ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::NOTIFICATION_CHANNEL_LOGGING_OUT")); + // if (simpleConsumer!=NULL) simpleConsumer->disconnect(); + // simpleConsumer=NULL; + /* ******************************************** */ + window.Destroy(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_CLOSED")); + ACE_OS::sleep(1); + try { + client.releaseComponent(COMPONENT_NAME); + } + catch (maciErrType::CannotReleaseComponentExImpl& E) { + E.log(); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::COMPONENT_RELEASED")); + if (loggedIn) client.logout(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::SHUTTING_DOWN")); + signal(SIGINT,SIG_DFL); + ACE_OS::sleep(1); + return 0; +} diff --git a/Common/Clients/GenericBackendTextClient/src/Makefile b/Common/Clients/GenericBackendTextClient/src/Makefile new file mode 100644 index 000000000..c9b3cbb0d --- /dev/null +++ b/Common/Clients/GenericBackendTextClient/src/Makefile @@ -0,0 +1,114 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.3 2010-03-17 09:37:30 a.orlati Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 29/04/09 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +USER_LIB = -lACE \ + -lbaci \ + -lmaci \ + -lmaciClient \ + -lTAO \ + -lTAO_DsLogAdmin \ + -lTAO_CosNaming \ + -lTAO_IORTable \ + -lTAO_PortableServer \ + -lTAO_Svc_Utils \ + -lTAO_CosTrading \ + -lTAO_CosNotification \ + -lTAO_DynamicAny \ + -lTAO_IFR_Client \ + -lTAO_CosProperty \ + -lacsutil \ + -lcdb \ + -llogging \ + -lacscomponent \ + -lacserr \ + -lm \ + -lloki \ + -lACSErrTypeCommon \ + -lncurses +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = _tui_GenericBackendTextClient +EXECUTABLES_L = + +# +# +# +_tui_GenericBackendTextClient_OBJECTS = BackendClient +_tui_GenericBackendTextClient_LIBS = GenericBackendStubs BackendsDefinitionsStubs IRALibrary ManagmentDefinitionsStubs \ + TextWindowLibrary ClientErrors ComponentErrors ManagementErrors BackendsErrors bulkDataStubs ACSBulkDataError bulkDataSenderStubs \ + bulkDataReceiverStubs ReceiversDefinitionsStubs + + +SCRIPTS = genericBackendTui + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Clients/GenericBackendTextClient/src/genericBackendTui b/Common/Clients/GenericBackendTextClient/src/genericBackendTui new file mode 100644 index 000000000..edd87c665 --- /dev/null +++ b/Common/Clients/GenericBackendTextClient/src/genericBackendTui @@ -0,0 +1,12 @@ +#! /bin/bash +# ********************************************************************************************* +# IRA Istituto di Radioastronomia +# "@(#) $Id: genericBackendTui,v 1.2 2010-03-17 09:37:30 a.orlati Exp $" +# +# This code is under GNU General Public Licence (GPL). +# +# Who when What +# Andrea Orlati(aorlati@ira.inaf.it) 06/05/2009 Creation +#************************************************************************ + +xterm -geometry 101x28-9-44 +sb -title GenericBackend -e /bin/bash --login -c "_tui_GenericBackendTextClient $1" & diff --git a/Common/Clients/Makefile b/Common/Clients/Makefile new file mode 100644 index 000000000..01df6293d --- /dev/null +++ b/Common/Clients/Makefile @@ -0,0 +1,166 @@ +#******************************************************************************* +# ALMA Project +# +# "@(#) $Id: Makefile,v 1.4 2010-12-21 09:52:17 c.migoni Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# sroberts 03/03/03 created +# +#******************************************************************************* +# This Makefile follows ACS Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# Modules in the various ACS sub-packages. +# +# The following example is for a subsystem called Voyager One +# which is composed of two directories, Alpha and Beta. + +# Alpha contains the modules alpha1, alpha2 and alpha3 +# Beta continas the moduels beta1, beta2 and beta3 +# +# Modify as appropriate to your subsystem + +SUBSYSTEM = Clients + +MODULES = ObservatoryTextClient \ + AntennaBossTextClient \ + SystemTerminal \ + GenericBackendTextClient \ + MinorServoBossTextClient + + +MAKE_FLAGS = "-k" +PLATFORM := $(shell uname) + +SHELL=/bin/bash +ECHO=echo + +ifdef MAKE_VERBOSE + AT = + OUTPUT = +else + AT = @ + OUTPUT = > /dev/null +endif +# +os = $(shell uname) +osrev = $(shell uname -r) + +ifeq ($(os),SunOS) + realtime=YES +endif + +# +# This target just forward any make target to all modules +# + + +define canned + @$(ECHO) "############ Executing '$@' on all $(SUBSYSTEM) modules #################" + @for member in $(foreach name, $(MODULES), $(name) ) ; do \ + $(ECHO) "############ $${member}" ;\ + if [ ! -d $${member} ]; then \ + echo "### ==> $${member} MODULE NOT FOUND! FAILED! " | tee -a build.log;\ + fi;\ + if [ -f $${member}/src/Makefile ]; then \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/src/ $@ || break ;\ + elif [ -f $${member}/ws/src/Makefile ]; then \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/ws/src/ $@ || break ;\ + fi;\ + if [ "$(realtime)" == "YES" ]; then \ + if [ -f $${member}/lcu/src/Makefile ]; then \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/lcu/src/ $@ || break ;\ + fi;\ + fi;\ + done +endef + +clean_log: + @$(ECHO) "############ Clean Build Log File: build.log #################" + @rm -f build.log + @touch build.log + +# +# building all modules +# +build: + @$(ECHO) "############ build $(SUBSYSTEM) Software #################"| tee -a build.log + @for member in $(foreach name, $(MODULES), $(name) ) ; do \ + if [ ! -d $${member} ]; then \ + echo "### ==> $${member} MODULE NOT FOUND! FAILED! " | tee -a build.log;\ + fi;\ + if [ -f $${member}/src/Makefile ]; then \ + $(ECHO) "############ $${member} MAIN" | tee -a build.log;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/src/ clean_dist >> build.log 2>& 1;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/src/ all >> build.log 2>& 1 || echo "### ==> FAILED all ! " | tee -a build.log; \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/src/ install >> build.log 2>& 1 || echo "### ==> FAILED install ! " | tee -a build.log; \ + continue ;\ + fi;\ + if [ -f $${member}/ws/src/Makefile ]; then \ + $(ECHO) "############ $${member} WS" | tee -a build.log;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/ws/src/ clean_dist >> build.log 2>& 1;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/ws/src/ all >> build.log 2>& 1 || echo "### ==> FAILED all ! " | tee -a build.log; \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/ws/src/ install >> build.log 2>& 1 || echo "### ==> FAILED install ! " | tee -a build.log; \ + fi;\ + if [ "$(realtime)" == "YES" ]; then \ + if [ -f $${member}/lcu/src/Makefile ]; then \ + $(ECHO) "############ $${member} LCU" | tee -a build.log;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/lcu/src/ clean_dist >> build.log 2>& 1;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/lcu/src/ all >> build.log 2>& 1 || echo "### ==> FAILED all ! " | tee -a build.log; \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/lcu/src/ install >> build.log 2>& 1 || echo "### ==> FAILED install ! " | tee -a build.log; \ + fi;\ + fi;\ + done +# +# Test target +# + +.PHONY: test + +Test = test +$(Test): + @$(ECHO) "############ Clean Test Log File: test.log #################" + @rm -f test.log + @touch test.log + @$(ECHO) "############ TEST $(SUBSYSTEM) Software #################"| tee -a test.log + @for member in $(foreach name,$(MODULES),$(name)); do\ + if [ -d $${member}/ws/test ]; then\ + $(ECHO) "############ $${member}/ws/test WS TEST ############" | tee -a test.log ;\ + $(MAKE) -k -C $${member}/ws/test/ $@ | tee -a test.log | grep -E '(Nothing to|FAILED.|PASSED.|Error:)';\ + if [ -d $${member}/lcu/test ]; then\ + $(ECHO) "############ $${member}/lcu/test LCU TEST ############" | tee -a test.log;\ + $(MAKE) -k -C $${member}/lcu/test/ $@ | tee -a test.log | grep -E '(Nothing to|FAILED.|PASSED.|Error:)';\ + fi;\ + elif [ -d $${member}/test ]; then\ + $(ECHO) "############ $${member}/test MAIN TEST ############" | tee -a test.log ;\ + $(MAKE) -k -C $${member}/test/ $@ | tee -a test.log | grep -E '(Nothing to|FAILED.|PASSED.|Error:)';\ + else\ + $(ECHO) "### ==> $${member} TEST DIRECTORY STRUCTURE NOT FOUND! FAILED!" | tee -a test.log ;\ + fi;\ + done + @$(ECHO) "... done" +# +# Standard canned targets +# +clean_dist: + $(canned) +all: + $(canned) +install: + $(canned) +man: + $(canned) + +buildClean: build clean + +buildMan: build man + +# +# ___oOo___ diff --git a/Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h b/Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h new file mode 100644 index 000000000..97cdc5198 --- /dev/null +++ b/Common/Clients/MinorServoBossTextClient/include/MinorServoBossTextClient.h @@ -0,0 +1,106 @@ +#ifndef COMPONENTTEXTCLIENTTEMPLATE_H +#define COMPONENTTEXTCLIENTTEMPLATE_H + +/* **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/*Andrea O(a.orlati@ira.inaf.it) 16/09/2011 Creation */ + +/* Add the component skeleton header file */ +/* ************************************* */ +#include +/* ************************************* */ + +/* Add the component errors header file */ +/* ************************************* */ +#include +#include +#include +/* ************************************* */ + +/* Add the client specific errors header file */ +/* ************************************* */ +#include +/* ************************************* */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define GRAY_COLOR 0 +#define BLUE_GRAY 0 +#define GRAY_BLUE 1 +#define BLACK_RED 2 +#define BLACK_GREEN 3 +#define BLACK_YELLOW 4 +#define BLACK_BLUE 5 +#define BLACK_MAGENTA 6 +#define BLACK_WHITE 7 + +/* define the max number of arguments that can be passed to component methods */ +/* ************************************************************************** */ +#define MAXFIELDNUMBER 10 +/* ************************************************************************** */ + +/* define the main frame dimension */ +/* ******************************* */ +#define WINDOW_WIDTH 60 /*columns */ +#define WINDOW_HEIGHT 15 /* rows */ +/* ******************************* */ + +/* define the routine name here, to be used for logging */ +/* **************************************************** */ +#define MODULE_NAME "MinorServoBossTextClient" /* the name of this module (filename without .cpp) */ +/* **************************************************** */ + +/* define the application title and style */ +/* ************************************* */ +#define APPLICATION_TITLE "Minor Servos" /* the title of the main frame */ +#define TITLE_COLOR_PAIR CColorPair::RED_BLACK /* the title color and background */ +#define TITLE_STYLE CStyle::BOLD|CStyle::UNDERLINE /* the title style */ +/* ************************************* */ + +/* define name and component interface */ +/* ********************************** */ +#define COMPONENT_NAME "MINORSERVO/Boss" /* the name of the instantiation of the component */ +#define COMPONENT_INTERFACE_TPYE "IDL:alma/MinorServo/MinorServoBoss:1.0" /* the type of the interface */ +#define COMPONENT_IDL_MODULE MinorServo /* the IDL module that contains the component interface */ +#define COMPONENT_IDL_INTERFACE MinorServoBoss /* the IDL interface of the component */ +#define COMPONENT_SMARTPOINTER MinorServoBoss_var /* the component type */ +/* ********************************** */ + +/* define user input command style */ +/* ******************************* */ +#define USER_INPUT_COLOR_PAIR BLUE_GRAY /* user input color and background */ +#define USER_INPUT_STYLE CStyle::NORMAL /* user input style */ +/* ******************************* */ + +/* define output field look and feel */ +/* ********************************* */ +#define USE_OUTPUT_FIELD 1 /* 0 disable the output field */ +#define OUTPUT_FIELD_COLOR_PAIR GRAY_BLUE /* output field color and background */ +#define OUTPUT_FIELD_STYLE CStyle::NORMAL /* output field style */ +#define OUTPUT_FIELD_HEIGHT 4 /* output field height (number of rows) */ +/* ********************************* */ + +/* define this value (milliseconds) to set the log guard interval */ +#define GUARDINTERVAL 3000 +/* to send the client to sleep for a certain amount of time, setup this value (milliseconds) */ +#define MAINTHREADSLEEPTIME 200 + +#endif diff --git a/Common/Clients/MinorServoBossTextClient/src/Makefile b/Common/Clients/MinorServoBossTextClient/src/Makefile new file mode 100644 index 000000000..39d35e743 --- /dev/null +++ b/Common/Clients/MinorServoBossTextClient/src/Makefile @@ -0,0 +1,115 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id$" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 16/09/11 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +USER_LIB = -lACE \ + -lbaci \ + -lmaci \ + -lmaciClient \ + -lTAO \ + -lTAO_DsLogAdmin \ + -lTAO_CosNaming \ + -lTAO_IORTable \ + -lTAO_PortableServer \ + -lTAO_Svc_Utils \ + -lTAO_CosTrading \ + -lTAO_CosNotification \ + -lTAO_DynamicAny \ + -lTAO_IFR_Client \ + -lTAO_CosProperty \ + -lacsutil \ + -lcdb \ + -llogging \ + -lacscomponent \ + -lacserr \ + -lm \ + -lloki \ + -lACSErrTypeCommon \ + -lncurses + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = _tui_MinorServoBossTextClient +EXECUTABLES_L = + +# +# +_tui_MinorServoBossTextClient_OBJECTS = MinorServoBossTextClient +#xxxxx_LDFLAGS = +_tui_MinorServoBossTextClient_LIBS = MinorServoBossStubs IRALibrary ManagmentDefinitionsStubs \ + TextWindowLibrary ClientErrors ComponentErrors ManagementErrors MinorServoErrors AntennaDefinitionsStubs \ + MinorServoDefinitionsStubs + + +SCRIPTS = minorservoBossTui + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp new file mode 100644 index 000000000..b76fb6946 --- /dev/null +++ b/Common/Clients/MinorServoBossTextClient/src/MinorServoBossTextClient.cpp @@ -0,0 +1,414 @@ +#include "MinorServoBossTextClient.h" + +#define _GET_ACS_PROPERTY(TYPE,NAME) TYPE##_var NAME; \ +{ \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,"Trying to get property "#NAME"...")); \ + NAME=component->NAME(); \ + if (NAME.ptr()!=TYPE::_nil()) { \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %x",NAME.ptr())); \ + } \ + else { \ + _EXCPT(ClientErrors::CouldntAccessPropertyExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setPropertyName(#NAME); \ + impl.log(); \ + goto ErrorLabel; \ + } \ +} + +#define _INSTALL_MONITOR(COMP,TRIGGERTIME) { \ + if (!COMP->installAutomaticMonitor(GUARDINTERVAL)) { \ + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setAction("Install monitor"); \ + impl.setReason((const char*)COMP->getLastError()); \ + impl.log(); \ + ACE_OS::sleep(1); \ + goto ErrorLabel; \ + } \ + COMP->setTriggerTime(TRIGGERTIME); \ +} + +#define _CATCH_ALL(OUTPUT,ROUTINE,COMP_EXCEPTION) \ + catch (COMP_EXCEPTION &E) { \ + _ADD_BACKTRACE(ClientErrors::CouldntPerformActionExImpl,impl,E,ROUTINE); \ + IRA::CString Message; \ + if (OUTPUT!=NULL) { \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } \ + catch (CORBA::SystemException &C) { \ + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,ROUTINE); \ + impl.setName(C._name()); \ + impl.setMinor(C.minor()); \ + if (OUTPUT!=NULL) { \ + IRA::CString Message; \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } \ + catch (...) { \ + _EXCPT(ClientErrors::UnknownExImpl,impl,ROUTINE); \ + if (OUTPUT!=NULL) { \ + IRA::CString Message; \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } + +#define COMPONENT_INTERFACE COMPONENT_IDL_MODULE::COMPONENT_IDL_INTERFACE +#define COMPONENT_DECLARATION COMPONENT_IDL_MODULE::COMPONENT_SMARTPOINTER + +using namespace TW; + +static bool terminate; + +void quintHandler(int sig) +{ + terminate=true; +} + +#define TEMPLATE_4_ROTBOOLEAN Management::ROTBoolean_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,\ +_TW_CBpattern,ACS::CBpattern_var + +#define TEMPLATE_4_ROTSYSTEMSTATUS Management::ROTSystemStatus_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var + +#include + +template <_TW_PROPERTYCOMPONENT_C> +class CCustomPropertyText : public CPropertyComponent <_TW_PROPERTYCOMPONENT_TL> { +public: + CCustomPropertyText(PR property): CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>(property) { } + virtual ~CCustomPropertyText() {} +protected: + WORD draw() { + WORD width,height; + bool done; + CPoint newPosition; + IRA::CString tmp; + WORD iter,step; + WORD newX,newY; + IRA::CString value,orig,ret; + std::map data; + + int start=0; + if (!CFrameComponent::getMainFrame()) return 4; + if (!CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getEnabled()) return 1; + if (!CFrameComponent::getMainFrame()->insideBorders(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getPosition())) return 2; + height=CFrameComponent::getEffectiveHeight(); + width=CFrameComponent::getEffectiveWidth(); + orig=CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getValue(); + while (IRA::CIRATools::getNextToken(orig,start,' ',ret)) { + if ( (ret!=" ") && (ret!="") && (ret!="\n")) { + data[(const char *)ret]+=1; + } + } + value=""; + for (std::map::iterator i=data.begin(); i!=data.end(); ++i) { + IRA::CString temp; + temp.Format("%s (x%d) ",i->first.c_str(),i->second); + value+=temp; + } + step=value.GetLength()/width; + newY=CFrameComponent::getHeightAlignment(CPropertyComponent <_TW_PROPERTYCOMPONENT_TL>::getHAlign(),step,height); + iter=0; + done=false; + for (int i=0;iclearCanvas(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getPosition()+CPoint(0,i),width, + CStyle(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getStyle().getColorPair(),0))) return 3; + } + while ((newY0) { + tmp=value.Mid(iter*width,width); + } + else { + tmp=value; + done=true; + } + iter++; + newX=CFrameComponent::getWidthAlignment(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getWAlign(),tmp.GetLength(),width); + newPosition=CPoint(newX,newY); + if (!CFrameComponent::getMainFrame()->writeCanvas(newPosition+CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getPosition(),CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getStyle(),tmp)) return 3; + newY++; + } + return 0; + } +}; + +IRA::CString boolFormat(const baci::BACIValue& value,const void* arg) +{ + IRA::CString out=""; + BACIuLongLong app=0; + app=value.uLongLongValue(); + if (Management::MNG_TRUE==(Management::TBoolean)app) { + out="1"; + } + else { + out="0"; + } + return out; +} + + + + +int main(int argc, char *argv[]) { + bool loggedIn=false; + maci::SimpleClient client; + ACE_Time_Value tv(1); + IRA::CString inputCommand; + maci::ComponentInfo_var info; + CORBA::Object_var obj; + // Component declaration + COMPONENT_DECLARATION component; + + + /* Add frame controls declaration */ + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING> * actualSetup_field; + TW::CPropertyLedDisplay * tracking_display; + TW::CPropertyStatusBox * status_box; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING> * motionInfo_field; + + /* ******************************* */ + TW::CLabel *output_label; + TW::CInputCommand *userInput; + + terminate=false; + + // mainframe + TW::CFrame window(CPoint(0,0),CPoint(WINDOW_WIDTH,WINDOW_HEIGHT),'|','|','-','-'); + + // disable ctrl+C + signal(SIGINT,SIG_IGN); + signal(SIGUSR1,quintHandler); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MANAGER_LOGGING")); + try { + if (client.init(argc,argv)==0) { + _EXCPT(ClientErrors::CouldntInitExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + else { + if (client.login()==0) { + _EXCPT(ClientErrors::CouldntLoginExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + loggedIn=true; + } + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + // Window initialization + window.initFrame(); + window.setTitle(APPLICATION_TITLE); + // Change the style of the main frame + window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); + + if (window.colorReady()) { + window.defineColor(GRAY_COLOR,255,255,255); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); + window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); + } + else { + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_DEFAULT_COMPONENENT: %s",COMPONENT_INTERFACE_TPYE)); + try { + info=client.manager()->get_default_component(client.handle(),COMPONENT_INTERFACE_TPYE); + obj=info->reference; + if (CORBA::is_nil(obj.in())) { + _EXCPT(ClientErrors::CouldntAccessComponentExImpl,impl,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_INTERFACE_TPYE); + impl.log(); + goto ErrorLabel; + } + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ClientErrors::CouldntAccessComponentExImpl,impl,E,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_INTERFACE_TPYE); + impl.log(); + goto ErrorLabel; + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + component=COMPONENT_INTERFACE::_narrow(obj.in()); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %d",component.ptr())); + ACE_OS::sleep(1); + try { + _GET_ACS_PROPERTY(ACS::ROstring, actualSetup); + _GET_ACS_PROPERTY(Management::ROTBoolean, tracking); + _GET_ACS_PROPERTY(Management::ROTSystemStatus,status); + _GET_ACS_PROPERTY(ACS::ROstring, motionInfo); + /* ********************************* */ + ACE_OS::sleep(1); + actualSetup_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING>(actualSetup.in()); + tracking_display=new TW::CPropertyLedDisplay(tracking.in()); + status_box=new TW::CPropertyStatusBox (status.in(),Management::MNG_OK); + motionInfo_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING>(motionInfo.in()); + /* ************************ */ + #if USE_OUTPUT_FIELD >=1 + output_label=new TW::CLabel(""); + #else + output_label=NULL; + #endif + userInput=new TW::CInputCommand(); + + /** setting up the properties of the components of the frame controls */ + _TW_SET_COMPONENT(actualSetup_field,18,0,12,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + tracking_display->setPosition(CPoint(18,1)); + tracking_display->setOrientation(TW::CPropertyLedDisplay::HORIZONTAL); + tracking_display->setFormatFunction(boolFormat,NULL); + tracking_display->setLedStyle(0,TW::CStyle(CColorPair::GREEN_BLACK,0),TW::CStyle(CColorPair::RED_BLACK,0)); + //status_box + _TW_SET_COMPONENT(status_box,18,2,10,1,BLACK_GREEN,CStyle::BOLD,output_label); + status_box->setStatusLook(Management::MNG_OK,CStyle(BLACK_GREEN,CStyle::BOLD)); + status_box->setStatusLook(Management::MNG_WARNING,CStyle(BLACK_YELLOW,CStyle::BOLD)); + status_box->setStatusLook(Management::MNG_FAILURE,CStyle(BLACK_RED,CStyle::BOLD)); + _TW_SET_COMPONENT(motionInfo_field,18,3,23,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + + /* ****************************************************************** */ + _TW_SET_COMPONENT(userInput,0,WINDOW_HEIGHT-6,WINDOW_WIDTH-1,1,USER_INPUT_COLOR_PAIR,USER_INPUT_STYLE,NULL); + #if USE_OUTPUT_FIELD >=1 + _TW_SET_COMPONENT(output_label,0,WINDOW_HEIGHT-(OUTPUT_FIELD_HEIGHT+1),WINDOW_WIDTH-1,OUTPUT_FIELD_HEIGHT,OUTPUT_FIELD_COLOR_PAIR,OUTPUT_FIELD_STYLE,NULL); + #endif + + // Monitors + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MONITORS_INSTALLATION")); + /** Add all required monitor installation here */ + _INSTALL_MONITOR(actualSetup_field,3000); + _INSTALL_MONITOR(tracking_display,3000); + _INSTALL_MONITOR(status_box,3000); + _INSTALL_MONITOR(motionInfo_field,3000); + /* ****************************************** */ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + + /* Add all the static labels */ + _TW_ADD_LABEL("Current Setup :",0,0,27,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Tracking :",0,1,27,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Status :",0,2,27,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Motion Info :",0,3,27,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + /* ************************* */ + + /** Add all required association: components/Frame */ + window.addComponent((CFrameComponent*)actualSetup_field); + window.addComponent((CFrameComponent*)tracking_display); + window.addComponent((CFrameComponent*)status_box); + window.addComponent((CFrameComponent*)motionInfo_field); + /* ********************************************** */ + window.addComponent((CFrameComponent*)userInput); + #if USE_OUTPUT_FIELD >=1 + window.addComponent((CFrameComponent*)output_label); + #endif + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + // now it is possible to show the frame + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::START")); + window.showFrame(); + + while(!terminate) { + if (userInput->readCommand(inputCommand)) { + if (inputCommand=="exit") terminate=true; + else if (component->_is_a("IDL:alma/Management/CommandInterpreter:1.0")) { + try { + char * outputAnswer; + component->command((const char *)inputCommand,outputAnswer); + output_label->setValue(outputAnswer); + CORBA::string_free(outputAnswer); + output_label->Refresh(); + } + catch (CORBA::SystemException& ex) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"Main()"); + impl.setName(ex._name()); + impl.setMinor(ex.minor()); + IRA::CString Message; + _EXCPT_TO_CSTRING(Message,impl); + output_label->setValue(Message); + output_label->Refresh(); + impl.log(LM_ERROR); + } + catch(...) { + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,"Main()"); + impl.setAction("command()"); + impl.setReason("communication error to component server"); + IRA::CString Message; + _EXCPT_TO_CSTRING(Message,impl); + output_label->setValue(Message); + output_label->Refresh(); + impl.log(LM_ERROR); + } + } + else { + output_label->setValue("not enabled"); + output_label->Refresh(); + } + } + //sleep for the required ammount of time + tv.set(0,MAINTHREADSLEEPTIME*1000); + client.run(tv); + } + + window.closeFrame(); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::RELEASING")); + goto CloseLabel; +ErrorLabel: + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::ABORTING")); +CloseLabel: + window.Destroy(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_CLOSED")); + ACE_OS::sleep(1); + try { + client.releaseComponent(COMPONENT_NAME); + } + catch (maciErrType::CannotReleaseComponentExImpl& E) { + E.log(); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::COMPONENT_RELEASED")); + if (loggedIn) client.logout(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::SHUTTING_DOWN")); + signal(SIGINT,SIG_DFL); + ACE_OS::sleep(1); + return 0; +} diff --git a/Common/Clients/MinorServoBossTextClient/src/minorservoBossTui b/Common/Clients/MinorServoBossTextClient/src/minorservoBossTui new file mode 100644 index 000000000..0a721836d --- /dev/null +++ b/Common/Clients/MinorServoBossTextClient/src/minorservoBossTui @@ -0,0 +1 @@ +xterm -geometry 60x15+200+200 +sb -title MinorServo -e /bin/bash --login -c "_tui_MinorServoBossTextClient $1" & diff --git a/Common/Clients/ObservatoryTextClient/include/ObservatoryTextClient.h b/Common/Clients/ObservatoryTextClient/include/ObservatoryTextClient.h new file mode 100644 index 000000000..975f5c102 --- /dev/null +++ b/Common/Clients/ObservatoryTextClient/include/ObservatoryTextClient.h @@ -0,0 +1,86 @@ +#ifndef OBSERVATORYCLIENT_H +#define OBSERVATORYCLIENT_H + +/* **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* $Id: ObservatoryTextClient.h,v 1.10 2010-08-19 08:57:43 a.orlati Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 14/02/2007 Creation */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 14/02/2007 Ported to ACS 6.0.2 */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 24/09/2007 Ported to ACS 6.0.4 */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 06/04/2009 Connect to Component as default component */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 04/08/2010 command from user input removed, a part from "exit" */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 19/08/2010 displayed interface attrribute "observatoryName" */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define GRAY_COLOR 0 +#define BLUE_GRAY 0 +#define GRAY_BLUE 1 +#define BLACK_RED 2 +#define BLACK_GREEN 3 +#define BLACK_YELLOW 4 +#define BLACK_BLUE 5 +#define BLACK_MAGENTA 6 +#define BLACK_WHITE 7 + +/* define the max number of arguments that can be passed to component methods */ +#define MAXFIELDNUMBER 10 +/* *************************************************************************** */ + +/* define the main frame dimension */ +#define WINDOW_WIDTH 69 /*columns */ +#define WINDOW_HEIGHT 16 /* rows */ +/* ******************************* */ + +/* define the routine name here, to be used for logging */ +#define MODULE_NAME "observatoryTui" /* the name of this module (filename without .cpp) */ +/* **************************************************** */ + +/* define the application title and style */ +#define APPLICATION_TITLE "Observatory" /* the title of the main frame */ +#define TITLE_COLOR_PAIR CColorPair::RED_BLACK /* the title color and background */ +#define TITLE_STYLE CStyle::BOLD|CStyle::UNDERLINE /* the title style */ +/* ************************************* */ + +/* define name and component interface */ +//#define COMPONENT_NAME "ANTENNA/Observatory" /* the name of the istantiation of the component */ +#define COMPONENT_INTERFACE_TPYE "IDL:alma/Antenna/Observatory:1.0" /* the type of the interface */ +#define COMPONENT_IDL_MODULE Antenna /* the IDL module that contains the component interface */ +#define COMPONENT_IDL_INTERFACE Observatory /* the IDL interface of the component */ +#define COMPONENT_SMARTPOINTER Observatory_var /* the component type */ +/* ********************************** */ + +/* define user input command style */ +#define USER_INPUT_COLOR_PAIR BLUE_GRAY /* user input color and background */ +#define USER_INPUT_STYLE CStyle::NORMAL /* user input style */ +/* ******************************* */ + +/* define output field look and feel */ +#define USE_OUTPUT_FIELD 1 /* 0 disable the output field */ +#define OUTPUT_FIELD_COLOR_PAIR GRAY_BLUE /* output field color and background */ +#define OUTPUT_FIELD_STYLE CStyle::NORMAL /* output field style */ +#define OUTPUT_FIELD_HEIGHT 4 /* output field height (number of rows) */ +/* ********************************* */ + +/* define this value (milliseconds) to set the log guard interval */ +#define GUARDINTERVAL 1000 + +/* to send the client to sleep for a certain ammount of time, setup this value (milliseconds) */ +#define MAINTHREADSLEEPTIME 250 + + +#endif diff --git a/Common/Clients/ObservatoryTextClient/src/Makefile b/Common/Clients/ObservatoryTextClient/src/Makefile new file mode 100644 index 000000000..c38ec18b2 --- /dev/null +++ b/Common/Clients/ObservatoryTextClient/src/Makefile @@ -0,0 +1,116 @@ +#******************************************************************************* +# +# +# "@(#) $Id: Makefile,v 1.6 2011-06-21 16:41:00 a.orlati Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 14/02/06 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +USER_LIB = -lACE \ + -lbaci \ + -lmaci \ + -lmaciClient \ + -lTAO \ + -lTAO_DsLogAdmin \ + -lTAO_CosNaming \ + -lTAO_IORTable \ + -lTAO_PortableServer \ + -lTAO_Svc_Utils \ + -lTAO_CosTrading \ + -lTAO_CosNotification \ + -lTAO_DynamicAny \ + -lTAO_IFR_Client \ + -lTAO_CosProperty \ + -lacsutil \ + -lcdb \ + -llogging \ + -lacscomponent \ + -lacserr \ + -lm \ + -lloki \ + -lACSErrTypeCommon \ + -lncurses + + + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = _tui_ObservatoryTextClient +EXECUTABLES_L = + +# +# +_tui_ObservatoryTextClient_OBJECTS = ObservatoryTextClient +_tui_ObservatoryTextClient_LIBS = ObservatoryStubs IRALibrary \ +TextWindowLibrary ClientErrors ComponentErrors AntennaDefinitionsStubs ManagmentDefinitionsStubs \ +ManagementErrors + + +SCRIPTS = observatoryTui + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Clients/ObservatoryTextClient/src/ObservatoryTextClient.cpp b/Common/Clients/ObservatoryTextClient/src/ObservatoryTextClient.cpp new file mode 100644 index 000000000..a66f97aa8 --- /dev/null +++ b/Common/Clients/ObservatoryTextClient/src/ObservatoryTextClient.cpp @@ -0,0 +1,440 @@ +// $Id: ObservatoryTextClient.cpp,v 1.8 2010-08-19 08:57:43 a.orlati Exp $ + +#include "ObservatoryTextClient.h" +#include +#include + +#define _GET_ACS_PROPERTY(TYPE,NAME) TYPE##_var NAME; \ +{ \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,"Trying to get property "#NAME"...")); \ + NAME=component->NAME(); \ + if (NAME.ptr()!=TYPE::_nil()) { \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %x",NAME.ptr())); \ + } \ + else { \ + _EXCPT(ClientErrors::CouldntAccessPropertyExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setPropertyName(#NAME); \ + impl.log(); \ + goto ErrorLabel; \ + } \ +} + +#define _INSTALL_MONITOR(COMP,TRIGGERTIME) { \ + if (!COMP->installAutomaticMonitor(GUARDINTERVAL)) { \ + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setAction("Install monitor"); \ + impl.setReason((const char*)COMP->getLastError()); \ + impl.log(); \ + ACE_OS::sleep(1); \ + goto ErrorLabel; \ + } \ + COMP->setTriggerTime(TRIGGERTIME); \ +} + +#define _GET_PROPERTY_VALUE_ONCE(TYPE,CAST,FORMAT,PROPERTY,PROPERTNAME,CONTROL) { \ + try { \ + TYPE temp; \ + ACSErr::Completion_var cmpl; \ + temp=PROPERTY->get_sync(cmpl.out()); \ + CompletionImpl cmplImpl(cmpl.in()); \ + if (cmplImpl.isErrorFree()) { \ + IRA::CString val(0,FORMAT,(CAST)temp); \ + CONTROL->setValue(val); \ + CONTROL->Refresh(); \ + } \ + else { \ + _ADD_BACKTRACE(ClientErrors::CouldntAccessPropertyExImpl,impl,cmplImpl,"::Main()"); \ + impl.setPropertyName(PROPERTNAME); \ + impl.log(); \ + goto ErrorLabel; \ + } \ + } \ + catch (...) { \ + _EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); \ + impl.log(); \ + goto ErrorLabel; \ + } \ +} + +#define _CATCH_ALL(OUTPUT,ROUTINE,COMP_EXCEPTION) \ + catch (COMP_EXCEPTION &E) { \ + _ADD_BACKTRACE(ClientErrors::CouldntPerformActionExImpl,impl,E,ROUTINE); \ + IRA::CString Message; \ + if (OUTPUT!=NULL) { \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } \ + catch (CORBA::SystemException &C) { \ + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,ROUTINE); \ + impl.setName(C._name()); \ + impl.setMinor(C.minor()); \ + if (OUTPUT!=NULL) { \ + IRA::CString Message; \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } \ + catch (...) { \ + _EXCPT(ClientErrors::UnknownExImpl,impl,ROUTINE); \ + if (OUTPUT!=NULL) { \ + IRA::CString Message; \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } + +#define COMPONENT_INTERFACE COMPONENT_IDL_MODULE::COMPONENT_IDL_INTERFACE +#define COMPONENT_DECLARATION COMPONENT_IDL_MODULE::COMPONENT_SMARTPOINTER + +using namespace TW; + +static bool terminate; + +void quintHandler(int sig) +{ + terminate=true; +} + +#define TEMPLATE_4_ROTGEOMODEL Antenna::ROTGeodeticModel_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var + +/** + * This code is a simple client for the Observatory component. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia + *
+*/ +int main(int argc, char *argv[]) { + bool loggedIn=false; + int fieldCounter; + maci::SimpleClient client; + ACE_Time_Value tv(1); + IRA::CString fields[MAXFIELDNUMBER]; + char formatString[20]; + + + maci::ComponentInfo_var info; + CORBA::Object_var obj; + // Component declaration + COMPONENT_DECLARATION component=COMPONENT_INTERFACE::_nil(); + + /* ************************************* */ + + /* Add frame controls declaration */ + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(uLongLong)> *universalTime_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *julianDay_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(uLongLong)> *GAST_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(uLongLong)> *LocalST_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(string)> *name_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *longitude_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *latitude_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *height_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *xGeoid_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *yGeoid_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *zGeoid_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *DUT1_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *xPolarMotion_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)> *yPolarMotion_field; + TW::CPropertyStatusBox* geodeticModel_box; + /* ******************************* */ + TW::CLabel *output_label; + TW::CInputCommand *userInput; + + /* Add callbacks object declaration */ + //ACS::CBDescIn desc; + //CCallbackVoid cbUnstow; + //CCallbackVoid cbStow; + /* ******************************** */ + + terminate=false; + + // mainframe + TW::CFrame window(CPoint(0,0),CPoint(WINDOW_WIDTH,WINDOW_HEIGHT),'|','|','-','-'); + + // disable ctrl+C + signal(SIGINT,SIG_IGN); + signal(SIGUSR1,quintHandler); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MANAGER_LOGGING")); + try { + if (client.init(argc,argv)==0) { + _EXCPT(ClientErrors::CouldntInitExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + else { + if (client.login()==0) { + _EXCPT(ClientErrors::CouldntLoginExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + loggedIn=true; + } + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + // Window initialization + window.initFrame(); + window.setTitle(APPLICATION_TITLE); + // Change the style of the main frame + window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); + + if (window.colorReady()) { + window.defineColor(GRAY_COLOR,255,255,255); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); + window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); + } + else { + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_DEFAULT_COMPONENENT: %s",COMPONENT_INTERFACE_TPYE)); + try { + info=client.manager()->get_default_component(client.handle(),COMPONENT_INTERFACE_TPYE); + obj=info->reference; + if (CORBA::is_nil(obj.in())) { + _EXCPT(ClientErrors::CouldntAccessComponentExImpl,impl,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_INTERFACE_TPYE); + impl.log(); + goto ErrorLabel; + } + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ClientErrors::CouldntAccessComponentExImpl,impl,E,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_INTERFACE_TPYE); + impl.log(); + goto ErrorLabel; + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + component=COMPONENT_INTERFACE::_narrow(obj.in()); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %d",component.ptr())); + ACE_OS::sleep(1); + try { + /* Add all component properties here */ + _GET_ACS_PROPERTY(ACS::ROuLongLong,universalTime); + _GET_ACS_PROPERTY(ACS::ROdouble,julianDay); + _GET_ACS_PROPERTY(ACS::ROuLongLong,GAST); + _GET_ACS_PROPERTY(ACS::ROdouble,xPolarMotion); + _GET_ACS_PROPERTY(ACS::ROdouble,yPolarMotion); + _GET_ACS_PROPERTY(ACS::ROuLongLong,LST); + _GET_ACS_PROPERTY(ACS::ROstring,observatoryName); + _GET_ACS_PROPERTY(ACS::ROdouble,longitude); + _GET_ACS_PROPERTY(ACS::ROdouble,latitude); + _GET_ACS_PROPERTY(ACS::ROdouble,height); + _GET_ACS_PROPERTY(ACS::ROdouble,xGeod); + _GET_ACS_PROPERTY(ACS::ROdouble,yGeod); + _GET_ACS_PROPERTY(ACS::ROdouble,zGeod); + _GET_ACS_PROPERTY(ACS::ROdouble,DUT1); + _GET_ACS_PROPERTY(Antenna::ROTGeodeticModel,geodeticModel); + /* ********************************* */ + ACE_OS::sleep(1); + + /** Frame controls creation */ + universalTime_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(uLongLong)>(universalTime.in()); + GAST_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(uLongLong)>(GAST.in()); + julianDay_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(julianDay.in()); + LocalST_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(uLongLong)>(LST.in()); + name_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(string)>(observatoryName.in()); + longitude_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(longitude.in()); + latitude_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(latitude.in()); + height_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(height.in()); + xGeoid_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(xGeod.in()); + yGeoid_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(yGeod.in()); + zGeoid_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(zGeod.in()); + DUT1_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(DUT1.in()); + xPolarMotion_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(xPolarMotion.in()); + yPolarMotion_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(double)>(yPolarMotion.in()); + geodeticModel_box=new TW::CPropertyStatusBox(geodeticModel.in(),Antenna::GEOID_WGS84); + /* ************************ */ + #if USE_OUTPUT_FIELD >=1 + output_label=new TW::CLabel(""); + #else + output_label=NULL; + #endif + userInput=new TW::CInputCommand(); + + /** setting up the properties of the components of the frame controls */ + + _TW_SET_COMPONENT(name_field,22,0,22,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(universalTime_field,22,1,22,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + universalTime_field->setFormatFunction(CFormatFunctions::dateTimeClockFormat,NULL); + _TW_SET_COMPONENT(julianDay_field,22,2,20,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + julianDay_field->setFormatFunction(CFormatFunctions::floatingPointFormat,NULL); + _TW_SET_COMPONENT(GAST_field,22,3,26,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + GAST_field->setFormatFunction(CFormatFunctions::clockFormat,NULL); + _TW_SET_COMPONENT(LocalST_field,22,4,26,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + LocalST_field->setFormatFunction(CFormatFunctions::clockFormat,NULL); + _TW_SET_COMPONENT(DUT1_field,22,5,15,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(xPolarMotion_field,22,6,12,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(yPolarMotion_field,35,6,12,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + + _TW_SET_COMPONENT(latitude_field,22,7,12,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(longitude_field,35,7,12,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(height_field,48,7,6,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + strcpy(formatString,"%.3lf"); + _TW_SET_COMPONENT(xGeoid_field,22,8,12,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + xGeoid_field->setFormatFunction(CFormatFunctions::floatingPointFormat,static_cast(formatString)); + _TW_SET_COMPONENT(yGeoid_field,35,8,12,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + yGeoid_field->setFormatFunction(CFormatFunctions::floatingPointFormat,static_cast(formatString)); + _TW_SET_COMPONENT(zGeoid_field,48,8,12,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + zGeoid_field->setFormatFunction(CFormatFunctions::floatingPointFormat,static_cast(formatString)); + _TW_SET_COMPONENT(geodeticModel_box,55,7,10,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + geodeticModel_box->setStatusLook(Antenna::GEOID_WGS84); + geodeticModel_box->setStatusLook(Antenna::GEOID_GRS80); + geodeticModel_box->setStatusLook(Antenna::GEOID_MERIT83); + geodeticModel_box->setStatusLook(Antenna::GEOID_OSU91A); + geodeticModel_box->setStatusLook(Antenna::GEOID_SOVIET85); + /* ****************************************************************** */ + _TW_SET_COMPONENT(userInput,0,WINDOW_HEIGHT-6,WINDOW_WIDTH-1,1,USER_INPUT_COLOR_PAIR,USER_INPUT_STYLE,NULL); + #if USE_OUTPUT_FIELD >=1 + _TW_SET_COMPONENT(output_label,0,WINDOW_HEIGHT-(OUTPUT_FIELD_HEIGHT+1),WINDOW_WIDTH-1,OUTPUT_FIELD_HEIGHT,OUTPUT_FIELD_COLOR_PAIR,OUTPUT_FIELD_STYLE,NULL); + #endif + + _GET_PROPERTY_VALUE_ONCE(IRA::CString,const char *,"%s",observatoryName,"observatoryName",name_field) + _GET_PROPERTY_VALUE_ONCE(double,double,"%.6lf",latitude,"latitude",latitude_field); + _GET_PROPERTY_VALUE_ONCE(double,double,"%.6lf",longitude,"longitude",longitude_field); + _GET_PROPERTY_VALUE_ONCE(double,double,"%.1lf",height,"height",height_field); + + // Monitors + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MONITORS_INSTALLATION")); + /** Add all required monitor installation here */ + _INSTALL_MONITOR(universalTime_field,200); + _INSTALL_MONITOR(julianDay_field,200); + _INSTALL_MONITOR(GAST_field,200); + _INSTALL_MONITOR(LocalST_field,200); + _INSTALL_MONITOR(xGeoid_field,5000); + xGeoid_field->setValueTrigger(0.00001,true); + _INSTALL_MONITOR(zGeoid_field,5000); + zGeoid_field->setValueTrigger(0.00001,true); + _INSTALL_MONITOR(yGeoid_field,5000); + yGeoid_field->setValueTrigger(0.00001,true); + _INSTALL_MONITOR(DUT1_field,5000); + DUT1_field->setValueTrigger(1e-6,true); + _INSTALL_MONITOR(xPolarMotion_field,5000); + xPolarMotion_field->setValueTrigger(1e-6,true); + _INSTALL_MONITOR(yPolarMotion_field,5000); + yPolarMotion_field->setValueTrigger(1e-6,true); + _INSTALL_MONITOR(geodeticModel_box,5000); + geodeticModel_box->setValueTrigger(1L,true); + /* ****************************************** */ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + + /* Add all the static labels */ + _TW_ADD_LABEL("Observatory Name :",0,0,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Universal Time :",0,1,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Julian Day :",0,2,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Apparent GST :",0,3,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("LST :",0,4,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("DUT1 :",0,5,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Pole motion (x,y):",0,6,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Geodetic Coords :",0,7,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Geocentric Coords:",0,8,18,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + /* ************************* */ + + /** Add all required association: components/Frame */ + window.addComponent((CFrameComponent*)universalTime_field); + window.addComponent((CFrameComponent*)GAST_field); + window.addComponent((CFrameComponent*)LocalST_field); + window.addComponent((CFrameComponent*)julianDay_field); + window.addComponent((CFrameComponent*)latitude_field); + window.addComponent((CFrameComponent*)name_field); + window.addComponent((CFrameComponent*)longitude_field); + window.addComponent((CFrameComponent*)height_field); + window.addComponent((CFrameComponent*)xGeoid_field); + window.addComponent((CFrameComponent*)yGeoid_field); + window.addComponent((CFrameComponent*)zGeoid_field); + window.addComponent((CFrameComponent*)DUT1_field); + window.addComponent((CFrameComponent*)geodeticModel_box); + window.addComponent((CFrameComponent*)xPolarMotion_field); + window.addComponent((CFrameComponent*)yPolarMotion_field); + /* ********************************************** */ + window.addComponent((CFrameComponent*)userInput); + #if USE_OUTPUT_FIELD >=1 + window.addComponent((CFrameComponent*)output_label); + #endif + + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + // now it is possible to show the frame + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::START")); + window.showFrame(); + while(!terminate) { + if ((fieldCounter=userInput->parseCommand(fields,MAXFIELDNUMBER))>0) { + fields[0].MakeUpper(); + if (fields[0]=="EXIT") terminate=true; + } + client.run(tv); + tv.set(0,MAINTHREADSLEEPTIME*1000); + } + window.closeFrame(); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::RELEASING")); + goto CloseLabel; +ErrorLabel: + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::ABORTING")); +CloseLabel: + /* Instructions to free the notification channel */ + // ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::NOTIFICATION_CHANNEL_LOGGING_OUT")); + // if (simpleConsumer!=NULL) simpleConsumer->disconnect(); + // simpleConsumer=NULL; + /* ******************************************** */ + window.Destroy(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_CLOSED")); + ACE_OS::sleep(1); + try { + if (!CORBA::is_nil(component.in())) { + client.releaseComponent(component->name()); + } + } + catch (maciErrType::CannotReleaseComponentExImpl& E) { + E.log(); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::COMPONENT_RELEASED")); + if (loggedIn) client.logout(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::SHUTTING_DOWN")); + signal(SIGINT,SIG_DFL); + ACE_OS::sleep(1); + return 0; +} diff --git a/Common/Clients/ObservatoryTextClient/src/observatoryTui b/Common/Clients/ObservatoryTextClient/src/observatoryTui new file mode 100644 index 000000000..23fb38eac --- /dev/null +++ b/Common/Clients/ObservatoryTextClient/src/observatoryTui @@ -0,0 +1,13 @@ +#! /bin/bash +# ********************************************************************************************* +# IRA Istituto di Radioastronomia +# "@(#) $Id: observatoryTui,v 1.2 2010-08-19 08:57:43 a.orlati Exp $" +# +# This code is under GNU General Public Licence (GPL). +# +# Who when What +# Andrea Orlati(aorlati@ira.inaf.it) 03/04/2009 Creation +#************************************************************************ + + +xterm -geometry 69x16+0+0 +sb -title Observatory -e /bin/bash --login -c _tui_ObservatoryTextClient & \ No newline at end of file diff --git a/Common/Clients/ReceiversBossTextClient/include/ReceiversBossTextClient.h b/Common/Clients/ReceiversBossTextClient/include/ReceiversBossTextClient.h new file mode 100644 index 000000000..d0d1c83df --- /dev/null +++ b/Common/Clients/ReceiversBossTextClient/include/ReceiversBossTextClient.h @@ -0,0 +1,108 @@ +#ifndef COMPONENTTEXTCLIENTTEMPLATE_H +#define COMPONENTTEXTCLIENTTEMPLATE_H + +/* **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/*Andrea O(a.orlati@ira.inaf.it) 16/09/2011 Creation */ + +/* Add the component skeleton header file */ +/* ************************************* */ +#include +#include +/* ************************************* */ + +/* Add the component errors header file */ +/* ************************************* */ +#include +#include +#include +/* ************************************* */ + +/* Add the client specific errors header file */ +/* ************************************* */ +#include +/* ************************************* */ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define GRAY_COLOR 0 +#define BLUE_GRAY 0 +#define GRAY_BLUE 1 +#define BLACK_RED 2 +#define BLACK_GREEN 3 +#define BLACK_YELLOW 4 +#define BLACK_BLUE 5 +#define BLACK_MAGENTA 6 +#define BLACK_WHITE 7 + +/* define the max number of arguments that can be passed to component methods */ +/* ************************************************************************** */ +#define MAXFIELDNUMBER 10 +/* ************************************************************************** */ + +/* define the main frame dimension */ +/* ******************************* */ +#define WINDOW_WIDTH 60 /*columns */ +#define WINDOW_HEIGHT 22 /* rows */ +/* ******************************* */ + +/* define the routine name here, to be used for logging */ +/* **************************************************** */ +#define MODULE_NAME "ReceiversBossTextClient" /* the name of this module (filename without .cpp) */ +/* **************************************************** */ + +/* define the application title and style */ +/* ************************************* */ +#define APPLICATION_TITLE "Receivers" /* the title of the main frame */ +#define TITLE_COLOR_PAIR CColorPair::RED_BLACK /* the title color and background */ +#define TITLE_STYLE CStyle::BOLD|CStyle::UNDERLINE /* the title style */ +/* ************************************* */ + +/* define name and component interface */ +/* ********************************** */ +#define COMPONENT_NAME "RECEIVERS/Boss" /* the name of the instantiation of the component */ +#define COMPONENT_INTERFACE_TPYE "IDL:alma/Receivers/ReceiversBoss:1.0" /* the type of the interface */ +#define DEWAR_INTERFACE_TPYE "IDL:alma/Receivers/DewarPositioner:1.0" +#define COMPONENT_IDL_MODULE Receivers /* the IDL module that contains the component interface */ +#define COMPONENT_IDL_INTERFACE ReceiversBoss /* the IDL interface of the component */ +#define DEWAR_IDL_INTERFACE DewarPositioner +#define COMPONENT_SMARTPOINTER ReceiversBoss_var /* the component type */ +#define DEWAR_SMARTPOINTER DewarPositioner_var +/* ********************************** */ + +/* define user input command style */ +/* ******************************* */ +#define USER_INPUT_COLOR_PAIR BLUE_GRAY /* user input color and background */ +#define USER_INPUT_STYLE CStyle::NORMAL /* user input style */ +/* ******************************* */ + +/* define output field look and feel */ +/* ********************************* */ +#define USE_OUTPUT_FIELD 1 /* 0 disable the output field */ +#define OUTPUT_FIELD_COLOR_PAIR GRAY_BLUE /* output field color and background */ +#define OUTPUT_FIELD_STYLE CStyle::NORMAL /* output field style */ +#define OUTPUT_FIELD_HEIGHT 4 /* output field height (number of rows) */ +/* ********************************* */ + +/* define this value (milliseconds) to set the log guard interval */ +#define GUARDINTERVAL 3000 +/* to send the client to sleep for a certain amount of time, setup this value (milliseconds) */ +#define MAINTHREADSLEEPTIME 200 + +#endif diff --git a/Common/Clients/ReceiversBossTextClient/src/Makefile b/Common/Clients/ReceiversBossTextClient/src/Makefile new file mode 100644 index 000000000..a039f9eb8 --- /dev/null +++ b/Common/Clients/ReceiversBossTextClient/src/Makefile @@ -0,0 +1,114 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id$" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 16/09/11 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +USER_LIB = -lACE \ + -lbaci \ + -lmaci \ + -lmaciClient \ + -lTAO \ + -lTAO_DsLogAdmin \ + -lTAO_CosNaming \ + -lTAO_IORTable \ + -lTAO_PortableServer \ + -lTAO_Svc_Utils \ + -lTAO_CosTrading \ + -lTAO_CosNotification \ + -lTAO_DynamicAny \ + -lTAO_IFR_Client \ + -lTAO_CosProperty \ + -lacsutil \ + -lcdb \ + -llogging \ + -lacscomponent \ + -lacserr \ + -lm \ + -lloki \ + -lACSErrTypeCommon \ + -lncurses + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = _tui_ReceiversBossTextClient +EXECUTABLES_L = + +# +# +_tui_ReceiversBossTextClient_OBJECTS = ReceiversBossTextClient +#xxxxx_LDFLAGS = +_tui_ReceiversBossTextClient_LIBS = ReceiversBossStubs CommonReceiverInterfaceStubs ReceiversDefinitionsStubs IRALibrary ManagmentDefinitionsStubs \ + TextWindowLibrary ClientErrors ComponentErrors ManagementErrors ReceiversErrors acsnc AntennaDefinitionsStubs \ + DewarPositionerStubs DewarPositionerDefinitionsStubs + +SCRIPTS = receiversBossTui + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Clients/ReceiversBossTextClient/src/ReceiversBossTextClient.cpp b/Common/Clients/ReceiversBossTextClient/src/ReceiversBossTextClient.cpp new file mode 100644 index 000000000..f5f497b2c --- /dev/null +++ b/Common/Clients/ReceiversBossTextClient/src/ReceiversBossTextClient.cpp @@ -0,0 +1,577 @@ +#include "ReceiversBossTextClient.h" +#include "ReceiversDefinitionsC.h" +#include + +#define _GET_ACS_PROPERTY(TYPE,NAME) TYPE##_var NAME; \ +{ \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,"Trying to get property "#NAME"...")); \ + NAME=component->NAME(); \ + if (NAME.ptr()!=TYPE::_nil()) { \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %x",NAME.ptr())); \ + } \ + else { \ + _EXCPT(ClientErrors::CouldntAccessPropertyExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setPropertyName(#NAME); \ + impl.log(); \ + goto ErrorLabel; \ + } \ +} + +#define _INSTALL_MONITOR(COMP,TRIGGERTIME) { \ + if (!COMP->installAutomaticMonitor(GUARDINTERVAL)) { \ + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setAction("Install monitor"); \ + impl.setReason((const char*)COMP->getLastError()); \ + impl.log(); \ + ACE_OS::sleep(1); \ + goto ErrorLabel; \ + } \ + COMP->setTriggerTime(TRIGGERTIME); \ +} + +#define _CATCH_ALL(OUTPUT,ROUTINE,COMP_EXCEPTION) \ + catch (COMP_EXCEPTION &E) { \ + _ADD_BACKTRACE(ClientErrors::CouldntPerformActionExImpl,impl,E,ROUTINE); \ + IRA::CString Message; \ + if (OUTPUT!=NULL) { \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } \ + catch (CORBA::SystemException &C) { \ + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,ROUTINE); \ + impl.setName(C._name()); \ + impl.setMinor(C.minor()); \ + if (OUTPUT!=NULL) { \ + IRA::CString Message; \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } \ + catch (...) { \ + _EXCPT(ClientErrors::UnknownExImpl,impl,ROUTINE); \ + if (OUTPUT!=NULL) { \ + IRA::CString Message; \ + _EXCPT_TO_CSTRING(Message,impl); \ + OUTPUT->setValue(Message); \ + OUTPUT->Refresh(); \ + } \ + impl.log(); \ + } + +IRA::CLogGuard guard(GUARDINTERVAL*1000); +TW::CLabel* extraLabel1; +TW::CLabel* extraLabel2; +TW::CLabel* extraLabel3; +TW::CLabel* extraLabel4; +TW::CLabel* extraLabel5; +TW::CLabel* extraLabel6; + +#define COMPONENT_INTERFACE COMPONENT_IDL_MODULE::COMPONENT_IDL_INTERFACE +#define COMPONENT_DECLARATION COMPONENT_IDL_MODULE::COMPONENT_SMARTPOINTER +#define DEWAR_INTERFACE COMPONENT_IDL_MODULE::DEWAR_IDL_INTERFACE +#define DEWAR_DECLARATION COMPONENT_IDL_MODULE::DEWAR_SMARTPOINTER + +#include "updateDewar.i" + +using namespace TW; + +nc::SimpleConsumer *simpleConsumer=NULL; + +void NotificationHandler(Receivers::ReceiversDataBlock data,void *handlerParam) +{ + TW::CLedDisplay *control; + control=static_cast(handlerParam); + if (data.tracking) { + control->setValue("1"); + control->Refresh(); + } + else { + control->setValue("0"); + control->Refresh(); + } +} + +static bool terminate; + +void quintHandler(int sig) +{ + terminate=true; +} + +#define TEMPLATE_4_ROTSYSTEMSTATUS Management::ROTSystemStatus_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var + +#include + +template <_TW_PROPERTYCOMPONENT_C> +class CCustomPropertyText : public CPropertyComponent <_TW_PROPERTYCOMPONENT_TL> { +public: + CCustomPropertyText(PR property): CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>(property) { } + virtual ~CCustomPropertyText() {} +protected: + WORD draw() { + WORD width,height; + bool done; + CPoint newPosition; + IRA::CString tmp; + WORD iter,step; + WORD newX,newY; + IRA::CString value,orig,ret; + std::map data; + + int start=0; + if (!CFrameComponent::getMainFrame()) return 4; + if (!CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getEnabled()) return 1; + if (!CFrameComponent::getMainFrame()->insideBorders(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getPosition())) return 2; + height=CFrameComponent::getEffectiveHeight(); + width=CFrameComponent::getEffectiveWidth(); + orig=CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getValue(); + while (IRA::CIRATools::getNextToken(orig,start,' ',ret)) { + if ( (ret!=" ") && (ret!="") && (ret!="\n")) { + data[(const char *)ret]+=1; + } + } + value=""; + for (std::map::iterator i=data.begin(); i!=data.end(); ++i) { + IRA::CString temp; + temp.Format("%s (x%d) ",i->first.c_str(),i->second); + value+=temp; + } + step=value.GetLength()/width; + newY=CFrameComponent::getHeightAlignment(CPropertyComponent <_TW_PROPERTYCOMPONENT_TL>::getHAlign(),step,height); + iter=0; + done=false; + for (int i=0;iclearCanvas(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getPosition()+CPoint(0,i),width, + CStyle(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getStyle().getColorPair(),0))) return 3; + } + while ((newY0) { + tmp=value.Mid(iter*width,width); + } + else { + tmp=value; + done=true; + } + iter++; + newX=CFrameComponent::getWidthAlignment(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getWAlign(),tmp.GetLength(),width); + newPosition=CPoint(newX,newY); + if (!CFrameComponent::getMainFrame()->writeCanvas(newPosition+CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getPosition(),CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getStyle(),tmp)) return 3; + newY++; + } + return 0; + } +}; + + +IRA::CString polarizationFormat(const baci::BACIValue& value,const void* arg) +{ + if (value.longValue()==Receivers::RCV_LCP) { + return IRA::CString("LCP "); + } + else if (value.longValue()==Receivers::RCV_RCP) { + return IRA::CString("RCP "); + } + else if (value.longValue()==Receivers::RCV_VLP) { + return IRA::CString("VLP "); + } + else { // Receivers::RCV_HLP) + return IRA::CString("HLP "); + } +} + +IRA::CString IFFormat(const baci::BACIValue& value,const void* arg) +{ + long num=value.longValue(); + IRA::CString label(""); + for (long j=0;j *mode_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING> * actualSetup_field; + TW::CPropertyStatusBox * status_box; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)> *feeds_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)> *IFs_field; + TW::CLedDisplay * tracking_display; + CCustomPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(long)> *polarization_text; + CCustomPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)> *initialFrequency_text; + CCustomPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)> *bandWidth_text; + CCustomPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)> *LO_text; + + /* ******************************* */ + TW::CLabel *output_label; + TW::CInputCommand *userInput; + + terminate=false; + + // mainframe + TW::CFrame window(CPoint(0,0),CPoint(WINDOW_WIDTH,WINDOW_HEIGHT),'|','|','-','-'); + + // disable ctrl+C + signal(SIGINT,SIG_IGN); + signal(SIGUSR1,quintHandler); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MANAGER_LOGGING")); + try { + if (client.init(argc,argv)==0) { + _EXCPT(ClientErrors::CouldntInitExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + else { + if (client.login()==0) { + _EXCPT(ClientErrors::CouldntLoginExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + loggedIn=true; + } + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + // Window initialization + window.initFrame(); + window.setTitle(APPLICATION_TITLE); + // Change the style of the main frame + window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); + + if (window.colorReady()) { + window.defineColor(GRAY_COLOR,255,255,255); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); + window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); + } + else { + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_DEFAULT_COMPONENENT: %s",COMPONENT_INTERFACE_TPYE)); + try { + info=client.manager()->get_default_component(client.handle(),COMPONENT_INTERFACE_TPYE); + obj=info->reference; + if (CORBA::is_nil(obj.in())) { + _EXCPT(ClientErrors::CouldntAccessComponentExImpl,impl,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_INTERFACE_TPYE); + impl.log(); + goto ErrorLabel; + } + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ClientErrors::CouldntAccessComponentExImpl,impl,E,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_INTERFACE_TPYE); + impl.log(); + goto ErrorLabel; + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + component=COMPONENT_INTERFACE::_narrow(obj.in()); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"Receivers Boss reference is: %d",component.ptr())); + ACE_OS::sleep(1); + + try { + info=client.manager()->get_default_component(client.handle(),DEWAR_INTERFACE_TPYE); + obj=info->reference; + if (CORBA::is_nil(obj.in())) { + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_NOTICE,"Dewar positioner not available")); + dewar=DEWAR_INTERFACE::_nil(); + } + else { + dewar=DEWAR_INTERFACE::_narrow(obj.in()); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"Dewar reference is: %d",dewar.ptr())); + } + } + catch(...) { + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_NOTICE,"Dewar positioner not available")); + } + ACE_OS::sleep(1); + try { + /* Add all component properties here */ + _GET_ACS_PROPERTY(ACS::ROlong,IFs); + _GET_ACS_PROPERTY(ACS::ROlong,feeds); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,initialFrequency); + _GET_ACS_PROPERTY(ACS::ROlongSeq,polarization); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,bandWidth) + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,LO);; + _GET_ACS_PROPERTY(ACS::ROstring,mode); + _GET_ACS_PROPERTY(ACS::ROstring,actualSetup); + _GET_ACS_PROPERTY(Management::ROTSystemStatus,status); + /* ********************************* */ + ACE_OS::sleep(1); + /*ACSErr::Completion_var comp; + IFnumber=IFs->get_sync(comp.out());*/ + /** Frame controls creation */ + actualSetup_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING>(actualSetup.in()); + mode_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING>(mode.in()); + status_box=new TW::CPropertyStatusBox (status.in(),Management::MNG_OK); + feeds_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)>(feeds.in()); + IFs_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)>(IFs.in()); + initialFrequency_text=new CCustomPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)>(initialFrequency.in()); + bandWidth_text=new CCustomPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)>(bandWidth.in()); + LO_text=new CCustomPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)>(LO.in()); + polarization_text=new CCustomPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(long)>(polarization.in()); + tracking_display=new TW::CLedDisplay(1); + extraLabel1=new CLabel(""); + extraLabel2=new CLabel(""); + extraLabel3=new CLabel(""); + extraLabel4=new CLabel(""); + extraLabel5=new CLabel(""); + extraLabel6=new CLabel(""); + + /* ************************ */ + #if USE_OUTPUT_FIELD >=1 + output_label=new TW::CLabel(""); + #else + output_label=NULL; + #endif + userInput=new TW::CInputCommand(); + + /** setting up the properties of the components of the frame controls */ + //actualsetup_field + _TW_SET_COMPONENT(actualSetup_field,18,0,8,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + //mode_field + _TW_SET_COMPONENT(mode_field,18,1,10,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + //status_box + _TW_SET_COMPONENT(status_box,18,2,10,1,BLACK_GREEN,CStyle::BOLD,output_label); + status_box->setStatusLook(Management::MNG_OK,CStyle(BLACK_GREEN,CStyle::BOLD)); + status_box->setStatusLook(Management::MNG_WARNING,CStyle(BLACK_YELLOW,CStyle::BOLD)); + status_box->setStatusLook(Management::MNG_FAILURE,CStyle(BLACK_RED,CStyle::BOLD)); + //feeds_field + _TW_SET_COMPONENT(feeds_field,18,3,2,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + //IFs_field + _TW_SET_COMPONENT(IFs_field,18,4,2,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + //_TW_SET_COMPONENT(IFs_field,18,4,WINDOW_WIDTH-18,1,CColorPair::WHITE_BLACK,0,output_label); + //IFs_field->setFormatFunction(IFFormat,NULL); + //LO_text + _TW_SET_COMPONENT(LO_text,18,5,WINDOW_WIDTH-18,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + LO_text->setWAlign(CFrameComponent::LEFT); + //LO_text->setHAlign(CFrameComponent::UP); + LO_text->setFormatFunction(CFormatFunctions::floatingPointFormat,"%07.1lf"); + //initialFrequency_text + _TW_SET_COMPONENT(initialFrequency_text,18,6,WINDOW_WIDTH-18,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + initialFrequency_text->setWAlign(CFrameComponent::LEFT); + initialFrequency_text->setFormatFunction(CFormatFunctions::floatingPointFormat,"%07.1lf"); + //bandWidth_text + _TW_SET_COMPONENT(bandWidth_text,18,7,WINDOW_WIDTH-18,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + bandWidth_text->setWAlign(CFrameComponent::LEFT); + bandWidth_text->setFormatFunction(CFormatFunctions::floatingPointFormat,"%07.1lf"); + //polarization_text + _TW_SET_COMPONENT(polarization_text,18,8,WINDOW_WIDTH-18,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + polarization_text->setWAlign(CFrameComponent::LEFT); + polarization_text->setFormatFunction(polarizationFormat,NULL); + tracking_display->setPosition(CPoint(48,2)); + tracking_display->setOrientation(TW::CLedDisplay::HORIZONTAL); + tracking_display->setLedStyle(0,TW::CStyle(CColorPair::GREEN_BLACK,0),TW::CStyle(CColorPair::RED_BLACK,0)); + + // extra labels.......... + extraLabel1->setWidth(WINDOW_WIDTH-2); extraLabel1->setHeight(1); extraLabel1->setPosition(TW::CPoint(0,10)); + extraLabel2->setWidth(WINDOW_WIDTH-2); extraLabel2->setHeight(1); extraLabel2->setPosition(TW::CPoint(0,11)); + extraLabel3->setWidth(WINDOW_WIDTH-2); extraLabel3->setHeight(1); extraLabel3->setPosition(TW::CPoint(0,12)); + extraLabel4->setWidth(WINDOW_WIDTH-2); extraLabel4->setHeight(1); extraLabel4->setPosition(TW::CPoint(0,13)); + extraLabel5->setWidth(WINDOW_WIDTH-2); extraLabel5->setHeight(1); extraLabel5->setPosition(TW::CPoint(0,14)); + extraLabel6->setWidth(WINDOW_WIDTH-2); extraLabel6->setHeight(1); extraLabel6->setPosition(TW::CPoint(0,15)); + + /* ****************************************************************** */ + _TW_SET_COMPONENT(userInput,0,WINDOW_HEIGHT-6,WINDOW_WIDTH-1,1,USER_INPUT_COLOR_PAIR,USER_INPUT_STYLE,NULL); + #if USE_OUTPUT_FIELD >=1 + _TW_SET_COMPONENT(output_label,0,WINDOW_HEIGHT-(OUTPUT_FIELD_HEIGHT+1),WINDOW_WIDTH-1,OUTPUT_FIELD_HEIGHT,OUTPUT_FIELD_COLOR_PAIR,OUTPUT_FIELD_STYLE,NULL); + #endif + + // Monitors + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MONITORS_INSTALLATION")); + /** Add all required monitor installation here */ + _INSTALL_MONITOR(actualSetup_field,3000); + _INSTALL_MONITOR(mode_field,3000); + _INSTALL_MONITOR(status_box,3000); + //status_box->setValueTrigger(1L,true); + _INSTALL_MONITOR(LO_text,3000); + //LO_text->setValueTrigger(0.0,true); + _INSTALL_MONITOR(bandWidth_text,3000); + //bandWidth_text->setValueTrigger(0.0,true); + _INSTALL_MONITOR(initialFrequency_text,3000); + //initialFrequency_text->setValueTrigger(0.0,true); + _INSTALL_MONITOR(polarization_text,3000); + //polarization_text->setValueTrigger(1L,true); + _INSTALL_MONITOR(feeds_field,3000) + _INSTALL_MONITOR(IFs_field,3000) + //feeds_field->setValueTrigger(1L,true);. + _INSTALL_MONITOR(polarization_text,3000) + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::NOTIFICATION_CHANNEL_SUBSCRIPTION")); + ACS_NEW_SIMPLE_CONSUMER(simpleConsumer,Receivers::ReceiversDataBlock,Receivers::RECEIVERS_DATA_CHANNEL, + NotificationHandler,static_cast(tracking_display)); + simpleConsumer->consumerReady(); + /* ****************************************** */ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + + /* Add all the static labels */ + _TW_ADD_LABEL("Current Setup :",0,0,17,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Mode :",0,1,17,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Status :",0,2,17,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Feeds :",0,3,17,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("IFs :",0,4,17,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("LO :",0,5,17,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Start Freq. :",0,6,17,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Bandwidth :",0,7,17,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Polarization :",0,8,17,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Dewar :",31,2,17,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL(" ____________________Dewar Positioner_____________________",0,9,WINDOW_WIDTH-2,1,CColorPair::GREEN_BLACK,CStyle::BOLD,window); + + /* ************************* */ + + /** Add all required association: components/Frame */ + window.addComponent((CFrameComponent*)actualSetup_field); + window.addComponent((CFrameComponent*)mode_field); + window.addComponent((CFrameComponent*)status_box); + window.addComponent((CFrameComponent*)feeds_field); + window.addComponent((CFrameComponent*)IFs_field); + window.addComponent((CFrameComponent*)initialFrequency_text); + window.addComponent((CFrameComponent*)bandWidth_text); + window.addComponent((CFrameComponent*)LO_text); + window.addComponent((CFrameComponent*)polarization_text); + window.addComponent((CFrameComponent*)tracking_display); + window.addComponent((CFrameComponent*)extraLabel1); + window.addComponent((CFrameComponent*)extraLabel2); + window.addComponent((CFrameComponent*)extraLabel3); + window.addComponent((CFrameComponent*)extraLabel4); + window.addComponent((CFrameComponent*)extraLabel5); + window.addComponent((CFrameComponent*)extraLabel6); + + /* ********************************************** */ + window.addComponent((CFrameComponent*)userInput); + #if USE_OUTPUT_FIELD >=1 + window.addComponent((CFrameComponent*)output_label); + #endif + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + // now it is possible to show the frame + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::START")); + window.showFrame(); + + while(!terminate) { + if (userInput->readCommand(inputCommand)) { + if (inputCommand=="exit") terminate=true; + else if (component->_is_a("IDL:alma/Management/CommandInterpreter:1.0")) { + try { + char * outputAnswer; + component->command((const char *)inputCommand,outputAnswer); + output_label->setValue(outputAnswer); + CORBA::string_free(outputAnswer); + output_label->Refresh(); + } + catch (CORBA::SystemException& ex) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"Main()"); + impl.setName(ex._name()); + impl.setMinor(ex.minor()); + IRA::CString Message; + _EXCPT_TO_CSTRING(Message,impl); + output_label->setValue(Message); + output_label->Refresh(); + impl.log(LM_ERROR); + } + catch(...) { + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,"Main()"); + impl.setAction("command()"); + impl.setReason("communication error to component server"); + IRA::CString Message; + _EXCPT_TO_CSTRING(Message,impl); + output_label->setValue(Message); + output_label->Refresh(); + impl.log(LM_ERROR); + } + } + else { + output_label->setValue("not enabled"); + output_label->Refresh(); + } + } + // automatic update of some controls. + updateDewar(dewar.in()); + //sleep for the required ammount of time + tv.set(0,MAINTHREADSLEEPTIME*1000); + client.run(tv); + } + window.closeFrame(); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::RELEASING")); + goto CloseLabel; +ErrorLabel: + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::ABORTING")); +CloseLabel: + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::NOTIFICATION_CHANNEL_LOGGING_OUT")); + if (simpleConsumer!=NULL) simpleConsumer->disconnect(); + simpleConsumer=NULL; + window.Destroy(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_CLOSED")); + ACE_OS::sleep(1); + try { + client.releaseComponent(COMPONENT_NAME); + if (!CORBA::is_nil(dewar)) { + client.releaseComponent(dewar->name()); + } + } + catch (maciErrType::CannotReleaseComponentExImpl& E) { + E.log(); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::COMPONENT_RELEASED")); + if (loggedIn) client.logout(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::SHUTTING_DOWN")); + signal(SIGINT,SIG_DFL); + ACE_OS::sleep(1); + return 0; +} diff --git a/Common/Clients/ReceiversBossTextClient/src/receiversBossTui b/Common/Clients/ReceiversBossTextClient/src/receiversBossTui new file mode 100644 index 000000000..cae95af8f --- /dev/null +++ b/Common/Clients/ReceiversBossTextClient/src/receiversBossTui @@ -0,0 +1,11 @@ +#! /bin/bash +# ********************************************************************************************* +# IRA Istituto di Radioastronomia +# +# This code is under GNU General Public Licence (GPL). +# +# Who when What +# Andrea Orlati(aorlati@ira.inaf.it) 19/09/2011 Creation +#************************************************************************ + +xterm -geometry 60x22+714+0 +sb -title Receivers -e /bin/bash --login -c "_tui_ReceiversBossTextClient $1" & diff --git a/Common/Clients/ReceiversBossTextClient/src/updateDewar.i b/Common/Clients/ReceiversBossTextClient/src/updateDewar.i new file mode 100644 index 000000000..cd7fd5544 --- /dev/null +++ b/Common/Clients/ReceiversBossTextClient/src/updateDewar.i @@ -0,0 +1,100 @@ + + +#ifndef _UPDATEDEWAR_I_ +#define _UPDATEDEWAR_I_ + +void updateDewar(Receivers::DewarPositioner_ptr dewar); + +void updateDewar(Receivers::DewarPositioner_ptr dewar) +{ + char *corbaStr; + IRA::CString configuration; + bool isRewRequired,isRewinding; + double position,iStaticPos,iParPos,dParPos,rewOff; + bool isReady; + Receivers::TDewarPositionerScanInfo_var info; + IRA::CString outString,format; + if (CORBA::is_nil(dewar)) { + outString=" ----- Not Available ----- "; + extraLabel3->setValue(outString); + extraLabel3->setStyle(TW::CStyle(TW::CColorPair::GREEN_BLACK,0)); + extraLabel3->Refresh(); + return; + } + try { + if (dewar->isConfigured()) { + corbaStr=dewar->getConfiguration(); + configuration=corbaStr; + CORBA::string_free(corbaStr); + isRewRequired=dewar->isRewindingRequired(); + isRewinding=dewar->isRewinding(); + position=dewar->getPosition(); + isReady=dewar->isReady(); + info=dewar->getScanInfo(); + iStaticPos=info->iStaticPos; + iParPos=info->iParallacticPos; + dParPos=info->dParallacticPos; + rewOff=info->rewindingOffset; + } + else { + configuration="none"; + isRewRequired=false; + isRewinding=false; + position=0.0; + isReady=true; + iStaticPos=iParPos=dParPos=rewOff=0; + } + } + catch (...) { + /*_EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); + _IRA_LOGGUARD_LOG_EXCEPTION(guard,impl,LM_ERROR);*/ + return; + } + outString="Configuration: "+configuration; + extraLabel1->setValue(outString); + extraLabel1->setStyle(TW::CStyle(TW::CColorPair::WHITE_BLACK,0)); + extraLabel1->Refresh(); + if (isReady) { + outString="Dewar is ready"; + extraLabel2->setValue(outString); + extraLabel2->setStyle(TW::CStyle(TW::CColorPair::GREEN_BLACK,0)); + extraLabel2->Refresh(); + } + else { + outString="Dewar not ready"; + extraLabel2->setValue(outString); + extraLabel2->setStyle(TW::CStyle(TW::CColorPair::RED_BLACK,0)); + extraLabel2->Refresh(); + } + format.Format("%05.1lf",position); + outString="Absolute Position: "+format; + extraLabel3->setValue(outString); + extraLabel3->setStyle(TW::CStyle(TW::CColorPair::WHITE_BLACK,0)); + extraLabel3->Refresh(); + format.Format("%05.1lf / %07.3lf / %07.3lf / %05.1lf",iStaticPos,iParPos,dParPos,rewOff); + outString="I / P / D / R: "+format; + extraLabel4->setValue(outString); + extraLabel4->setStyle(TW::CStyle(TW::CColorPair::WHITE_BLACK,0)); + extraLabel4->Refresh(); + if (isRewinding) { + outString="Rewinding required (rewinding...)"; + extraLabel5->setValue(outString); + extraLabel5->setStyle(TW::CStyle(TW::CColorPair::YELLOW_BLACK,0)); + extraLabel5->Refresh(); + } + else if (isRewRequired) { + outString="Rewinding required"; + extraLabel5->setValue(outString); + extraLabel5->setStyle(TW::CStyle(TW::CColorPair::RED_BLACK,0)); + extraLabel5->Refresh(); + } + else { + outString="Rewinding not required"; + extraLabel5->setValue(outString); + extraLabel5->setStyle(TW::CStyle(TW::CColorPair::GREEN_BLACK,0)); + extraLabel5->Refresh(); + } +} + +#endif + diff --git a/Common/Clients/SchedulerTextClient/include/SchedulerTuiClient.h b/Common/Clients/SchedulerTextClient/include/SchedulerTuiClient.h new file mode 100644 index 000000000..c86ba5279 --- /dev/null +++ b/Common/Clients/SchedulerTextClient/include/SchedulerTuiClient.h @@ -0,0 +1,96 @@ +#ifndef COMPONENTTEXTCLIENTTEMPLATE_H +#define COMPONENTTEXTCLIENTTEMPLATE_H + +/* **************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati (a.orlati@ira.inaf.it) 09/08/13 Creation */ +/* Andrea Orlati (a.orlati@ira.inaf.it) 12/04/14 display for the restFrequency attribute */ + +#include +#include + +#include + +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + + +#define GRAY_COLOR 0 +#define BLUE_GRAY 0 +#define GRAY_BLUE 1 +#define BLACK_RED 2 +#define BLACK_GREEN 3 +#define BLACK_YELLOW 4 +#define BLACK_BLUE 5 +#define BLACK_MAGENTA 6 +#define BLACK_WHITE 7 + +/* define the max number of arguments that can be passed to component methods */ +/* ************************************************************************** */ +#define MAXFIELDNUMBER 10 +/* ************************************************************************** */ + +/* define the main frame dimension */ +/* ******************************* */ +#define WINDOW_WIDTH 60 /*columns */ +#define WINDOW_HEIGHT 17 /* rows */ +/* ******************************* */ + +/* **************************************************** */ +#define MODULE_NAME "SchedulerTextClient" /* the name of this module (filename without .cpp) */ +/* **************************************************** */ + +/* define the application title and style */ +/* ************************************* */ +#define APPLICATION_TITLE "Scheduler" /* the title of the main frame */ +#define TITLE_COLOR_PAIR CColorPair::RED_BLACK /* the title color and background */ +#define TITLE_STYLE CStyle::BOLD|CStyle::UNDERLINE /* the title style */ +/* ************************************* */ + +/* define name and component interface */ +/* ********************************** */ +#define COMPONENT_INTERFACE_TPYE "IDL:alma/Management/Scheduler:1.0" /* the type of the interface */ +#define COMPONENT_IDL_MODULE Management /* the IDL module that contains the component interface */ +#define COMPONENT_IDL_INTERFACE Scheduler /* the IDL interface of the component */ +#define COMPONENT_SMARTPOINTER Scheduler_var /* the component type */ +/* ********************************** */ + +/* define user input command style */ +/* ******************************* */ +#define USER_INPUT_COLOR_PAIR BLUE_GRAY /* user input color and background */ +#define USER_INPUT_STYLE CStyle::NORMAL /* user input style */ +/* ******************************* */ + +/* define output field look and feel */ +/* ********************************* */ +#define USE_OUTPUT_FIELD 1 /* 0 disable the output field */ +#define OUTPUT_FIELD_COLOR_PAIR GRAY_BLUE /* output field color and background */ +#define OUTPUT_FIELD_STYLE CStyle::NORMAL /* output field style */ +#define OUTPUT_FIELD_HEIGHT 4 /* output field height (number of rows) */ +/* ********************************* */ + +/* define this value (milliseconds) to set the log guard interval */ +#define GUARDINTERVAL 1000 +/* to send the client to sleep for a certain ammount of time, setup this value (milliseconds) */ +#define MAINTHREADSLEEPTIME 200 + +#endif diff --git a/Common/Clients/SchedulerTextClient/src/Makefile b/Common/Clients/SchedulerTextClient/src/Makefile new file mode 100644 index 000000000..aabb7a71c --- /dev/null +++ b/Common/Clients/SchedulerTextClient/src/Makefile @@ -0,0 +1,235 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id$" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 09/08/13 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +USER_LIB = -lACE \ + -lbaci \ + -lmaci \ + -lmaciClient \ + -lTAO \ + -lTAO_DsLogAdmin \ + -lTAO_CosNaming \ + -lTAO_IORTable \ + -lTAO_PortableServer \ + -lTAO_Svc_Utils \ + -lTAO_CosTrading \ + -lTAO_CosNotification \ + -lTAO_DynamicAny \ + -lTAO_IFR_Client \ + -lTAO_CosProperty \ + -lacsutil \ + -lcdb \ + -llogging \ + -lacscomponent \ + -lacserr \ + -lm \ + -lloki \ + -lACSErrTypeCommon \ + -lncurses + +#USER_INC = + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = _tui_SchedulerTextClient +EXECUTABLES_L = + +_tui_SchedulerTextClient_OBJECTS= SchedulerTuiClient +_tui_SchedulerTextClient_LIBS= SchedulerStubs ManagementErrors ComponentErrors ClientErrors ManagmentDefinitionsStubs \ + IRALibrary TextWindowLibrary AntennaDefinitionsStubs + +# +# +xxxxx_OBJECTS = +xxxxx_LDFLAGS = +xxxxx_LIBS = + +# +# special compilation flags for single c sources +#yyyyy_CFLAGS = + +# +# Includes (.h) files (public only) +# --------------------------------- +INCLUDES = + +# +# Libraries (public and local) +# ---------------------------- +LIBRARIES = +LIBRARIES_L = + +# +# +lllll_OBJECTS = + +# +# Scripts (public and local) +# ---------------------------- +SCRIPTS = schedulerTui +SCRIPTS_L = + +# +# TCL scripts (public and local) +# ------------------------------ +TCL_SCRIPTS = +TCL_SCRIPTS_L = + +# +# Python stuff (public and local) +# ---------------------------- +PY_SCRIPTS = +PY_SCRIPTS_L = + +PY_MODULES = +PY_MODULES_L = + +PY_PACKAGES = +PY_PACKAGES_L = +pppppp_MODULES = + +# +# +tttttt_OBJECTS = +tttttt_TCLSH = +tttttt_LIBS = + +# +# TCL libraries (public and local) +# ------------------------------ +TCL_LIBRARIES = +TCL_LIBRARIES_L = + +# +# +tttlll_OBJECTS = + +# +# Configuration Database Files +# ---------------------------- +CDB_SCHEMAS = + +# +# IDL Files and flags +# +IDL_FILES = +TAO_IDLFLAGS = +USER_IDL = +# +# Jarfiles and their directories +# +JARFILES= +jjj_DIRS= +jjj_EXTRAS= +# +# java sources in Jarfile on/off +DEBUG= +# +# ACS XmlIdl generation on/off +# +XML_IDL= +# +# Java Component Helper Classes generation on/off +# +COMPONENT_HELPERS= +# +# Java Entity Classes generation on/off +# +XSDBIND= +# +# Schema Config files for the above +# +XSDBIND_INCLUDE= +# man pages to be done +# -------------------- +MANSECTIONS = +MAN1 = +MAN3 = +MAN5 = +MAN7 = +MAN8 = + +# +# local man pages +# --------------- +MANl = + +# +# ASCII file to be converted into Framemaker-MIF +# -------------------- +ASCII_TO_MIF = + +# +# other files to be installed +#---------------------------- +INSTALL_FILES = + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Clients/SchedulerTextClient/src/SchedulerTuiClient.cpp b/Common/Clients/SchedulerTextClient/src/SchedulerTuiClient.cpp new file mode 100644 index 000000000..248b9846b --- /dev/null +++ b/Common/Clients/SchedulerTextClient/src/SchedulerTuiClient.cpp @@ -0,0 +1,444 @@ +#include "SchedulerTuiClient.h" + +#define _GET_ACS_PROPERTY(TYPE,NAME) TYPE##_var NAME; \ +{ \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,"Trying to get property "#NAME"...")); \ + NAME=component->NAME(); \ + if (NAME.ptr()!=TYPE::_nil()) { \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %x",NAME.ptr())); \ + } \ + else { \ + _EXCPT(ClientErrors::CouldntAccessPropertyExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setPropertyName(#NAME); \ + impl.log(); \ + goto ErrorLabel; \ + } \ +} + +#define _INSTALL_MONITOR(COMP,TRIGGERTIME) { \ + if (!COMP->installAutomaticMonitor(GUARDINTERVAL)) { \ + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setAction("Install monitor"); \ + impl.setReason((const char*)COMP->getLastError()); \ + impl.log(); \ + ACE_OS::sleep(1); \ + goto ErrorLabel; \ + } \ + COMP->setTriggerTime(TRIGGERTIME); \ +} + +#define COMPONENT_INTERFACE COMPONENT_IDL_MODULE::COMPONENT_IDL_INTERFACE +#define COMPONENT_DECLARATION COMPONENT_IDL_MODULE::COMPONENT_SMARTPOINTER + +#define TEMPLATE_4_ROTBOOLEAN Management::ROTBoolean_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var +#define TEMPLATE_4_ROTSYSTEMSTATUS Management::ROTSystemStatus_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var + +using namespace TW; + +/** + * Special widget to handle seuqnce attributes + */ +template <_TW_PROPERTYCOMPONENT_C> +class CCustomPropertyText : public CPropertyComponent <_TW_PROPERTYCOMPONENT_TL> { +public: + CCustomPropertyText(PR property): CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>(property) { } + virtual ~CCustomPropertyText() {} +protected: + WORD draw() { + WORD width,height; + bool done; + CPoint newPosition; + IRA::CString tmp; + WORD iter,step; + WORD newX,newY; + IRA::CString value,orig,ret; + std::map data; + + int start=0; + if (!CFrameComponent::getMainFrame()) return 4; + if (!CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getEnabled()) return 1; + if (!CFrameComponent::getMainFrame()->insideBorders(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getPosition())) return 2; + height=CFrameComponent::getEffectiveHeight(); + width=CFrameComponent::getEffectiveWidth(); + orig=CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getValue(); + while (IRA::CIRATools::getNextToken(orig,start,' ',ret)) { + if ( (ret!=" ") && (ret!="") && (ret!="\n")) { + data[(const char *)ret]+=1; + } + } + value=""; + for (std::map::iterator i=data.begin(); i!=data.end(); ++i) { + IRA::CString temp; + temp.Format("%s (x%d) ",i->first.c_str(),i->second); + value+=temp; + } + step=value.GetLength()/width; + newY=CFrameComponent::getHeightAlignment(CPropertyComponent <_TW_PROPERTYCOMPONENT_TL>::getHAlign(),step,height); + iter=0; + done=false; + for (int i=0;iclearCanvas(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getPosition()+CPoint(0,i),width, + CStyle(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getStyle().getColorPair(),0))) return 3; + } + while ((newY0) { + tmp=value.Mid(iter*width,width); + } + else { + tmp=value; + done=true; + } + iter++; + newX=CFrameComponent::getWidthAlignment(CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getWAlign(),tmp.GetLength(),width); + newPosition=CPoint(newX,newY); + if (!CFrameComponent::getMainFrame()->writeCanvas(newPosition+CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getPosition(),CPropertyComponent<_TW_PROPERTYCOMPONENT_TL>::getStyle(),tmp)) return 3; + newY++; + } + return 0; + } +}; + + + + +static bool terminate; + +void quintHandler(int sig) +{ + terminate=true; +} + +IRA::CString trackingFormat(const baci::BACIValue& value,const void* arg) +{ + IRA::CString out=""; + BACIuLongLong app=0; + app=value.uLongLongValue(); + if (Management::MNG_TRUE==(Management::TBoolean)app) { + out="1"; + } + else { + out="0"; + } + return out; +} + +int main(int argc, char *argv[]) { + bool loggedIn=false; + //int fieldCounter; + maci::SimpleClient client; + ACE_Time_Value tv(1); + //IRA::CString fields[MAXFIELDNUMBER]; + //char formatString[20]; + IRA::CString inputCommand; + + // Component declaration + COMPONENT_DECLARATION component=COMPONENT_INTERFACE::_nil(); + + maci::ComponentInfo_var info; + CORBA::Object_var obj; + + + // Add frame controls declaration + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING> *projectCode_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING> *schedule_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)> *scanID_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)> *subScanID_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING> *currentBackend_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING> *currentRecorder_field; + TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)> *currentDevice_field; + TW::CPropertyStatusBox * status_box; + TW::CPropertyLedDisplay * tracking_display; + CCustomPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)> *restFrequency_text; + // ******************************* + TW::CLabel *output_label; + TW::CInputCommand *userInput; + + terminate=false; + // mainframe + CFrame window(CPoint(0,0),CPoint(WINDOW_WIDTH,WINDOW_HEIGHT),'|','|','-','-'); + + // disable ctrl+C + signal(SIGINT,SIG_IGN); + signal(SIGUSR1,quintHandler); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MANAGER_LOGGING")); + try { + if (client.init(argc,argv)==0) { + _EXCPT(ClientErrors::CouldntInitExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + else { + if (client.login()==0) { + _EXCPT(ClientErrors::CouldntLoginExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + loggedIn=true; + } + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + // Window initialization + window.initFrame(); + window.setTitle(APPLICATION_TITLE); + // Change the style of the main frame + window.setTitleStyle(CStyle(TITLE_COLOR_PAIR,TITLE_STYLE)); + + if (window.colorReady()) { + window.defineColor(GRAY_COLOR,255,255,255); + window.defineColorPair(BLUE_GRAY,CColor::BLUE,GRAY_COLOR); + window.defineColorPair(GRAY_BLUE,GRAY_COLOR,CColor::BLUE); + } + else { + window.defineColorPair(BLUE_GRAY,CColor::BLUE,CColor::WHITE); + window.defineColorPair(GRAY_BLUE,CColor::WHITE,CColor::BLUE); + window.defineColorPair(BLACK_RED,CColor::BLACK,CColor::RED); + window.defineColorPair(BLACK_GREEN,CColor::BLACK,CColor::GREEN); + window.defineColorPair(BLACK_YELLOW,CColor::BLACK,CColor::YELLOW); + window.defineColorPair(BLACK_BLUE,CColor::BLACK,CColor::BLUE); + window.defineColorPair(BLACK_MAGENTA,CColor::BLACK,CColor::MAGENTA); + window.defineColorPair(BLACK_WHITE,CColor::BLACK,CColor::WHITE ); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_INITIALIZED")); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::GET_DEFAULT_COMPONENENT: %s",COMPONENT_INTERFACE_TPYE)); + try { + info=client.manager()->get_default_component(client.handle(),COMPONENT_INTERFACE_TPYE); + obj=info->reference; + if (CORBA::is_nil(obj.in())) { + _EXCPT(ClientErrors::CouldntAccessComponentExImpl,impl,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_INTERFACE_TPYE); + impl.log(); + goto ErrorLabel; + } + } + catch (ACSErr::ACSbaseExImpl& E) { + _ADD_BACKTRACE(ClientErrors::CouldntAccessComponentExImpl,impl,E,MODULE_NAME"::Main()"); + impl.setComponentName(COMPONENT_INTERFACE_TPYE); + impl.log(); + goto ErrorLabel; + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + impl.log(); + goto ErrorLabel; + } + component=COMPONENT_INTERFACE::_narrow(obj.in()); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %d",component.ptr())); + ACE_OS::sleep(1); + try { + + // Add all component properties here + _GET_ACS_PROPERTY(ACS::ROstring,projectCode); + _GET_ACS_PROPERTY(ACS::ROlong,scanID); + _GET_ACS_PROPERTY(ACS::ROlong,subScanID); + _GET_ACS_PROPERTY(ACS::ROstring,scheduleName); + _GET_ACS_PROPERTY(ACS::ROstring,currentBackend); + _GET_ACS_PROPERTY(ACS::ROstring,currentRecorder); + _GET_ACS_PROPERTY(ACS::ROlong,currentDevice); + _GET_ACS_PROPERTY(Management::ROTBoolean,tracking); + _GET_ACS_PROPERTY(Management::ROTSystemStatus,status); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,restFrequency); + + // ********************************* + ACE_OS::sleep(1); + + // Frame controls creation + + projectCode_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING>(projectCode.in()); + schedule_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING>(scheduleName.in()); + scanID_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)>(scanID.in()); + subScanID_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)>(subScanID.in()); + currentDevice_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_RO(long)>(currentDevice.in()); + tracking_display=new TW::CPropertyLedDisplay(tracking.in()); + status_box=new TW::CPropertyStatusBox(status.in(),Management::MNG_OK) ; + currentBackend_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING>(currentBackend.in()); + currentRecorder_field=new TW::CPropertyText<_TW_PROPERTYCOMPONENT_T_ROSTRING>(currentRecorder.in()); + restFrequency_text=new CCustomPropertyText<_TW_SEQPROPERTYCOMPONENT_T_RO(double)>(restFrequency.in()); + + #if USE_OUTPUT_FIELD >=1 + output_label=new TW::CLabel(""); + #else + output_label=NULL; + #endif + userInput=new TW::CInputCommand(); + + // setting up the properties of the components of the frame controls + _TW_SET_COMPONENT(projectCode_field,20,0,24,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(schedule_field,20,1,20,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(scanID_field,20,2,4,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + char frm[8]; + strncpy(frm,"%04ld",8); + scanID_field->setFormatFunction(CFormatFunctions::integerFormat,static_cast(frm)); + scanID_field->setWAlign(CFrameComponent::RIGHT); + _TW_SET_COMPONENT(subScanID_field,25,2,4,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + subScanID_field->setFormatFunction(CFormatFunctions::integerFormat,static_cast(frm)); + _TW_SET_COMPONENT(currentBackend_field,20,3,24,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(currentRecorder_field,20,4,24,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + _TW_SET_COMPONENT(currentDevice_field,20,5,7,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + + _TW_SET_COMPONENT(restFrequency_text,20,6,WINDOW_WIDTH-18,1,CColorPair::WHITE_BLACK,CStyle::BOLD,output_label); + restFrequency_text->setWAlign(CFrameComponent::LEFT); + restFrequency_text->setFormatFunction(CFormatFunctions::floatingPointFormat,"%.1lf"); + tracking_display->setPosition(CPoint(20,7)); + tracking_display->setOrientation(TW::CPropertyLedDisplay::HORIZONTAL); + tracking_display->setFormatFunction(trackingFormat,NULL); + tracking_display->setLedStyle(0,TW::CStyle(CColorPair::GREEN_BLACK,0),TW::CStyle(CColorPair::RED_BLACK,0)); + _TW_SET_COMPONENT(status_box,20,8,10,1,BLACK_GREEN,CStyle::BOLD,output_label); + status_box->setStatusLook(Management::MNG_OK,CStyle(BLACK_GREEN,CStyle::BOLD)); + status_box->setStatusLook(Management::MNG_WARNING,CStyle(BLACK_YELLOW,CStyle::BOLD)); + status_box->setStatusLook(Management::MNG_FAILURE,CStyle(BLACK_RED,CStyle::BOLD)); + + + // ****************************************************************** + _TW_SET_COMPONENT(userInput,0,WINDOW_HEIGHT-6,WINDOW_WIDTH-1,1,USER_INPUT_COLOR_PAIR,USER_INPUT_STYLE,NULL); + #if USE_OUTPUT_FIELD >=1 + _TW_SET_COMPONENT(output_label,0,WINDOW_HEIGHT-(OUTPUT_FIELD_HEIGHT+1),WINDOW_WIDTH-1,OUTPUT_FIELD_HEIGHT,OUTPUT_FIELD_COLOR_PAIR,OUTPUT_FIELD_STYLE,NULL); + #endif + + // Monitors + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::MONITORS_INSTALLATION")); + // Add all required monitor installation here + _INSTALL_MONITOR(schedule_field,1000); + _INSTALL_MONITOR(scanID_field,1000); + _INSTALL_MONITOR(subScanID_field,1000); + _INSTALL_MONITOR(projectCode_field,1000); + _INSTALL_MONITOR(currentDevice_field,1000); + _INSTALL_MONITOR(tracking_display,200); + _INSTALL_MONITOR(currentBackend_field,1000); + _INSTALL_MONITOR(currentRecorder_field,1000); + _INSTALL_MONITOR(restFrequency_text,1000) + + //tracking_display->setValueTrigger(1L,true); + _INSTALL_MONITOR(status_box,3000); + status_box->setValueTrigger(1L,true); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::DONE")); + + // Add all the static labels + _TW_ADD_LABEL("Project Code :",0,0,16,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Schedule :",0,1,16,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Scan/SubScan :",0,2,16,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("/",24,2,1,1,CColorPair::WHITE_BLACK,0,window); + _TW_ADD_LABEL("Backend :",0,3,16,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Recorder :",0,4,16,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Device :",0,5,16,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Rest Freq. :",0,6,16,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Tracking :",0,7,16,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + _TW_ADD_LABEL("Status :",0,8,16,1,CColorPair::WHITE_BLACK,CStyle::UNDERLINE,window); + // ************************* + + // Add all required association: components/Frame + window.addComponent((CFrameComponent*)schedule_field); + window.addComponent((CFrameComponent*)scanID_field); + window.addComponent((CFrameComponent*)subScanID_field); + window.addComponent((CFrameComponent*)projectCode_field); + window.addComponent((CFrameComponent*)currentDevice_field); + window.addComponent((CFrameComponent*)tracking_display); + window.addComponent((CFrameComponent*)currentBackend_field); + window.addComponent((CFrameComponent*)currentRecorder_field); + window.addComponent((CFrameComponent*)status_box); + window.addComponent((CFrameComponent*)restFrequency_text); + // ********************************************** + window.addComponent((CFrameComponent*)userInput); + #if USE_OUTPUT_FIELD >=1 + window.addComponent((CFrameComponent*)output_label); + #endif + + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,MODULE_NAME"::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto ErrorLabel; + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,MODULE_NAME"::Main()"); + IRA::CString Message; + impl.log(); + goto ErrorLabel; + } + // now it is possible to show the frame + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::START")); + window.showFrame(); + while(!terminate) { + if (userInput->readCommand(inputCommand)) { + if (inputCommand=="exit") terminate=true; + else if (component->_is_a("IDL:alma/Management/CommandInterpreter:1.0")) { + try { + char * outputAnswer; + component->command((const char *)inputCommand,outputAnswer); + output_label->setValue(outputAnswer); + CORBA::string_free(outputAnswer); + output_label->Refresh(); + } + catch (CORBA::SystemException& ex) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"Main()"); + impl.setName(ex._name()); + impl.setMinor(ex.minor()); + IRA::CString Message; + _EXCPT_TO_CSTRING(Message,impl); + output_label->setValue(Message); + output_label->Refresh(); + impl.log(LM_ERROR); + } + catch(...) { + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,"Main()"); + impl.setAction("command()"); + impl.setReason("communication error to component server"); + IRA::CString Message; + _EXCPT_TO_CSTRING(Message,impl); + output_label->setValue(Message); + output_label->Refresh(); + impl.log(LM_ERROR); + } + } + else { + output_label->setValue("not enabled"); + output_label->Refresh(); + } + } + client.run(tv); + tv.set(0,MAINTHREADSLEEPTIME*1000); + } + + window.closeFrame(); + + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::RELEASING")); + goto CloseLabel; +ErrorLabel: + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::ABORTING")); +CloseLabel: + window.Destroy(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::FRAME_CLOSED")); + ACE_OS::sleep(1); + try { + if (!CORBA::is_nil(component.in())) { + client.releaseComponent(component->name()); + } + } + catch (maciErrType::CannotReleaseComponentExImpl& E) { + E.log(); + } + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::COMPONENT_RELEASED")); + if (loggedIn) client.logout(); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,MODULE_NAME"::SHUTTING_DOWN")); + signal(SIGINT,SIG_DFL); + signal(SIGUSR1,SIG_DFL); + ACE_OS::sleep(1); + return 0; +} + diff --git a/Common/Clients/SchedulerTextClient/src/schedulerTui b/Common/Clients/SchedulerTextClient/src/schedulerTui new file mode 100644 index 000000000..615569f79 --- /dev/null +++ b/Common/Clients/SchedulerTextClient/src/schedulerTui @@ -0,0 +1,11 @@ +#! /bin/bash +# ********************************************************************************************* +# IRA Istituto di Radioastronomia +# +# This code is under GNU General Public Licence (GPL). +# +# Who when What +# Andrea Orlati(aorlati@ira.inaf.it) 08/08/2013 Creation +#************************************************************************ + +xterm -geometry 60x17+0+241 +sb -title Scheduler -e /bin/bash --login -c _tui_SchedulerTextClient & diff --git a/Common/Clients/SystemTerminal/src/Makefile b/Common/Clients/SystemTerminal/src/Makefile new file mode 100644 index 000000000..cf203d007 --- /dev/null +++ b/Common/Clients/SystemTerminal/src/Makefile @@ -0,0 +1,75 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.2 2010-07-26 14:39:32 a.orlati Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 22/08/08 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# Python stuff (public and local) +# ---------------------------- +PY_SCRIPTS = _tui_SysTerm +PY_SCRIPTS_L = + +PY_MODULES = nuraghe_commands +PY_MODULES_L = + +PY_PACKAGES = +PY_PACKAGES_L = +pppppp_MODULES = + +SCRIPTS = operatorInput + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Clients/SystemTerminal/src/_tui_SysTerm.py b/Common/Clients/SystemTerminal/src/_tui_SysTerm.py new file mode 100644 index 000000000..8b9bd8a17 --- /dev/null +++ b/Common/Clients/SystemTerminal/src/_tui_SysTerm.py @@ -0,0 +1,183 @@ +#!/usr/bin/env python + +# This is a python client that can be used as a terminal to the system, It issues the command +# action of the connected sub-system boss. +#who when what +#andrea orlati(a.orlati@ira.inaf.it) 22/08/2008 Creation +#andrea orlati(a.orlati@ira.inaf.it) 25/09/2009 +#andrea orlati(a.orlati@ira.inaf.it) 23/07/2010 If no component name is given it logs into the scheduler +#andrea orlati(a.orlati@ira.inaf.it) 26/07/2010 Added support for command history +#andrea orlati(a.orlati@ira.inaf.it) 24/09/2010 Exceptions coming from the component command are now logged as it should be by a client application +#andrea orlati(a.orlati@ira.inaf.it) 20/07/2011 Logging exceptions now works also in ACS 8.2 +#Marco Buttu (mbuttu@oa-cagliari.inaf.it) 28/05/2013 Tab completion from a file of commands, help command +#andrea orlati(a.orlati@ira.inaf.it) 04/09/2013 Implemented support for external termination signal +#Marco Buttu (mbuttu@oa-cagliari.inaf.it) 16/12/2013 New answer format, showing the values in different lines +#Marco Buttu (mbuttu@oa-cagliari.inaf.it) 16/12/2013 Commands immediatly saved in the history file +#Marco Buttu (mbuttu@oa-cagliari.inaf.it) 22/10/2014 help() without argument lists all the commands +#Marco Buttu (mbuttu@oa-cagliari.inaf.it) 28/10/2014 control of the success value returned by the command + +import getopt, sys +import Acspy.Common.Err +import maciErrType +import maciErrTypeImpl +import ClientErrorsImpl +import ManagementErrors +import ManagementErrorsImpl +import ACSLog +import string +import readline +import os +import signal +from Acspy.Clients.SimpleClient import PySimpleClient +from nuraghe_commands import commands + +stopAll=False + +def usage(): + print "systerm [-h|--help] [ComponentName]" + print "ComponentName The name of a component that implements the CommandInterpreter interface" + print " If not given the Scheduler component is used." + print "[-h|--help] displays this help" + +def handler(num, stack): + global stopAll + stopAll=True + +def get_history_items(): + return [readline.get_history_item(i) for i in xrange(1,readline.get_current_history_length()+1)] + + +class HistoryCompleter(object): + + def __init__(self): + self.matches=[] + return + + def complete(self, text, state): + response=None + if state==0: + # history_values=get_history_items() + if text: + self.matches=sorted(c for c in commands if c and c.startswith(text)) + else: + self.matches=[] + try: + response=self.matches[state] + except IndexError: + response=None + return response + + +def main(): + + global stopAll + + #handler for the external request of termination + signal.signal(signal.SIGUSR1, handler) + + try: + opts, args = getopt.getopt(sys.argv[1:],"h",["help"]) + except getopt.GetoptError, err: + print str(err) + usage() + sys.exit(1) + + for o, a in opts: + if o in ("-h", "--help"): + usage() + sys.exit() + + simpleClient = PySimpleClient() + compName="" + + if args == []: + compType = "IDL:alma/Management/Scheduler:1.0" + try: + component=simpleClient.getDefaultComponent(compType) + compName=component._get_name() + except Exception , ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) + newEx.setComponentName(compType) + newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) + sys.exit(1) + else: + compName = args[0] + try: + component=simpleClient.getComponent(compName) + except Exception , ex: + newEx = ClientErrorsImpl.CouldntAccessComponentExImpl( exception=ex, create=1 ) + newEx.setComponentName(compName) + newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) + sys.exit(1) + + userHome = os.getenv('HOME') + historyFile = None + if userHome == None: + historyFile = '/tmp/.oprin_cmd.hist' + else: + historyFile = userHome+'/.oprin_cmd.hist' + + if os.path.exists(historyFile): + readline.read_history_file(historyFile) + + readline.set_completer(HistoryCompleter().complete) + readline.parse_and_bind('tab: complete') + + cmdCounter=0 + + while not stopAll: + try: + #sys.stdout.write("<%d> "%cmdCounter) + cmd='' + try: + #cmd=sys.stdin.readline() + cmd=raw_input("<%d> "%cmdCounter) + except IOError: + cmd='exit' + pass + cmdCounter=cmdCounter+1 + cmd=cmd.strip() + if cmd=="exit": + stopAll=True + elif cmd == 'help()': + print '\t' + '\n\t'.join(sorted(commands.keys())) + elif cmd.startswith('help('): + start = cmd.find('(') + 1 + end = cmd.find(')') + arg = cmd[start:end] # help(setupCCB) -> arg=setupCCB + if arg not in commands: + print "`%s` is not a valid command" %(arg if arg else cmd) + else: + print commands['help'](arg) + elif cmd: + readline.write_history_file(historyFile) + try: + success, res = component.command(cmd) + idx = res.find('\\') + cmd_name, response = res[:idx+1], res[idx+1:].rstrip('\\') + if success and response: + groups = response.split(',') + for group in groups: + values = group.split(';') + if len(values) > 1: + print cmd_name + for i, value in enumerate(values): + print '%02d) %s' %(i, value) + elif res: + print res + elif res: + print res + except Exception, ex: + newEx = ClientErrorsImpl.CouldntPerformActionExImpl(exception=ex, create=1) + newEx.setAction("command()") + newEx.setReason(ex.message) + newEx.log(simpleClient.getLogger(),ACSLog.ACS_LOG_ERROR) + except KeyboardInterrupt: + stopAll=True + + readline.write_history_file(historyFile) + simpleClient.releaseComponent(compName) + simpleClient.disconnect() + +if __name__=="__main__": + main() diff --git a/Common/Clients/SystemTerminal/src/nuraghe_commands.py b/Common/Clients/SystemTerminal/src/nuraghe_commands.py new file mode 100755 index 000000000..d2df20456 --- /dev/null +++ b/Common/Clients/SystemTerminal/src/nuraghe_commands.py @@ -0,0 +1,673 @@ +# Marco Buttu +# Doctrings from the "Observing at the SRT with Nuraghe, Issue n.8, 21/10/14", +# by Simona Righini and Andrea Orlati" + + +def antennaPark(): + """ + antennaPark sends the antenna to stow position + """ + +def antennaReset(): + """ + antennaReset resets the antenna status after a failure, for + example after the emergency stop button is released. + """ + +def antennaSetup(): + """ + antennaSetup=code (CCB, KKG, ...) + unstows the antenna, sets it to tracking mode and configures the + pointing model according to the specified receiver. It does NOT + perform the receiver and backend setup + """ + +def antennaStop(): + """ + antennaStop stops the antenna motion, if any, and changes the mount + mode to Stop. Activities can start again only commanding a mode change + as antennaTrack (which does not affect the overall setup) or a new setup + """ + +def antennaTrack(): + """ + antennaTrack sets the antenna to PROGRAMTRACK mode. It does not change + the pointing model or any receiver setup + """ + +def antennaUnstow(): + """ + antennaUnstow performs the unstow procedure + """ + +def asSetup(): + """ + asSetup=code + configures and enables the active surface (AS). Allowed values + of code: + + * SF: shaped configuration in fixed position (optimised for El=45d) + * S: shaped configuration in tracking - i.e. it adjusts according + to the observed elevation position + * PF: parabolic configuration in fixed position (optimised for El=45d) + * P: parabolic configuration in tracking - i.e. it adjusts according + to the observed elevation position + """ + +def azelOffsets(): + """ + azelOffsets=double'd',double'd' + sets the Az-El offsets (degrees). They are intended "on sky" + + e.g. > azelOffsets=0.5d,0.3d + sets an azimuth offset to 0.5 degrees and the elevation offset to + 0.3 degrees + """ + +def calOn(): + """ + calOn switches the calibration mark on + """ + +def calOff(): + """ + calOff switches the calibration mark off + """ + +def chooseBackend(): + """ + chooseBackend=string + selects the backend; string can be BACKENDS/TotalPower or BACKENDS/XARCOS + """ + +def chooseRecorder(): + """ + chooseRecorder=string + selects the backend; string can be MANAGEMENT/FitsZilla, MANAGEMENT/MBFitsWriter + or MANAGEMENT/Point + """ + +def clearServoOffsets(): + """ + clearServoOffsets + clears the offset of every minor servo + """ + +def crossScan(): + """ + crossScan=scanFrame,span,duration + performs a cross-scan on the previously selected target*, along the + scanFrame ('eq','hor' or 'gal'), spanning span degrees in duration seconds. + * indicated using the track or sidereal commands + """ + + +# def derotatorClearAutoRewindingSteps(): +# """ +# derotatorClearAutoRewindingSteps +# clears the auto rewinding steps. Look at the derotatorSetAutoRewindingSteps +# for more information. +# """ +# +# +# def derotatorIsUpdating(): +# """ +# derotatorIsUpdating +# returns True when the derotator is updating its position +# """ +# +# def derotatorGetActualSetup(): +# """ +# derotatorGetActualSetup +# returns 'none' if the derotator is not configured, otherwhise it returns +# the actual setup: +# +# > derotatorGetActualSetup +# none +# > derotatorSetup=KKG +# > derotatorGetActualSetup +# KKG +# """ +# +# def derotatorGetAutoRewindingSteps(): +# """ +# derotatorGetAutoRewindingSteps +# returns the number of steps (feeds) the derotator will be rewinded. For +# instance, for the K band derotator, two steps of auto rewinding means that +# in case of position out of range the derotator will be rewinded of 120 +# degrees (one step is 60 degrees) +# """ +# +# def derotatorGetConfiguration(): +# """ +# derotatorGetConfiguration +# returns the actual configuration: +# +# > derotatorGetConfiguration +# FIXED +# > derotatorSetConfiguration=BSC +# > derotatorGetConfiguration +# BSC +# """ +# +# def derotatorGetCmdPosition(): +# """ +# derotatorGetCmdPosition +# returns the commanded position +# """ +# +# def derotatorGetMaxLimit(): +# """ +# derotatorGetMaxLimit +# returns the maximum position allowed +# """ +# +# def derotatorGetMinLimit(): +# """ +# derotatorGetMinLimit +# returns the minimum position allowed +# """ +# +# def derotatorGetPosition(): +# """ +# derotatorGetPosition +# returns the actual position +# """ +# +# def derotatorGetRewindingMode(): +# """ +# derotatorGetRewindingMode +# returns the rewinding mode (AUTO or MANUAL) +# """ +# +# def derotatorGetRewindingStep(): +# """ +# derotatorGetRewindingStep +# returns the rewinding steps. In a symmetric derotator one step is +# the angle between two feeds. The rewinding steps is the number of +# feeds the derotator will be rewinded in case of position out of range. +# """ +# +# def derotatorGetScanInfo(): +# """ +# derotatorGetScanInfo +# returns the information about the current scan: +# +# > derotatorGetScanInfo +# axis: MNG_TRACK +# sector: ANT_NORTH +# Pis: 20.0000 +# Pip: 35.3300 +# Pdp: 10.1450 +# rewindingOffset: 0.0000 +# """ +# +# def derotatorIsReady(): +# """ +# derotatorIsReady +# returns True when the derotator is ready to move +# """ +# +# def derotatorIsRewinding(): +# """ +# derotatorIsRewinding +# returns True when the derotator is rewinding +# """ +# +# def derotatorIsRewindingRequired(): +# """ +# derotatorIsRewindingRequired +# returns True when a manual rewinding (derotatorRewind command) is required +# """ + +def derotatorPark(): + """ + derotatorPark + parks the derotator + """ + +# def derotatorRewind(): +# """ +# derotatorRewind +# rewinds the derotator for a given number of feeds. For instance, if you +# want to rewind the derotator for 2 feeds: +# +# > derotatorRewind=2 +# """ +# +# def derotatorSetAutoRewindingSteps(): +# """ +# derotatorSetAutoRewindingSteps +# sets the number of steps (feeds) the derotator will be rewinded. For +# instance, for the K band derotator, two steps of auto rewinding means that +# in case of position out of range the derotator will be rewinded of 120 +# degrees (one step is 60 degrees): +# +# > derotatorSetAutoRewindingSteps=2 +# +# The default auto rewinding steps is the maximum value allowed. +# """ + +def derotatorSetConfiguration(): + """ + derotatorSetConfiguration + sets the derotator configuration: + + > derotatorSetConfiguration=FIXED + > derotatorGetConfiguration + FIXED + > derotatorSetConfiguration=CUSTOM + > derotatorSetConfiguration=CUSTOM_OPT + > derotatorSetConfiguration=BSC + > derotatorSetConfiguration=BSC_OPT + + The default configuration is FIXED + """ + +def derotatorSetPosition(): + """ + derotatorSetPosition + sets the derotator position. For instance, to set the derotator position + to 30 degrees: + + > derotatorSetPosition=30d + + You can not set the position in the BSC and BSC_OPT configurations. + """ + +# def derotatorSetRewindingMode(): +# """ +# derotatorSetRewindingMode +# sets the rewinding mode to AUTO or MANUAL: +# +# > derotatorGetRewindingMode +# AUTO +# > derotatorSetRewindingMode=MANUAL +# > derotatorGetRewindingMode +# MANUAL +# """ +# +# def derotatorSetup(): +# """ +# derotatorSetup +# sets the dewar positioner in order to use the proper derotator. For +# instance, if you want to use the K band derotator: +# +# > derotatorSetup=KKG +# > derotatorGetActualSetup +# KKG +# """ + +def device(): + """ + device=sect + computes the beamsize, taking into account the present receiver and + backend configurations relative to section sect + """ + +def externalCalOn(): + """ + externalCalOn + allows an external device to switch the calibration mark (on/off) on the + active receiver + """ + +def externalCalOff(): + """ + externalCalOff + prevents an external device to switch the calibration mark (on/off) on the + active receiver + """ + +def flush(): + """ + flush=N deletes the N-th element in the queue of temporized commands + """ + +def flushAll(): + """ + flushAll deletes all the queue of the temporized commands + """ + +def focusScan(): + """ + focusScan=span,duration + commands a focus scan on a previously selected target (by means of + the track or sidereal commands). + Parameters: + + * span: the length run on the z-axis expressed in mm, + * duration: the time length espressed in hh:mm:ss, + + e.g. > focusScan=60,00:01:00 + """ + +def getAttenuations(): + """ + getAttenuations reads the attenuation values (dB) currently configured for + the active sections, and lists them according to increasing section number + """ + +def getTpi(): + """ + getTpi reads the signal intensity (raw counts) for the active sections, + and lists them according to increasing section number + """ + +def goOff(): + """ + goOff=frame,offset + slews the antenna to an offset position, in the indicated coordinate frame + ('eq', 'hor' or 'gal'). The user provides the offset value (degrees only), + but the system automatically chooses on which axis to perform the slewing, + taking into account the present position of the antenna + + e.g. > goOff=eq,1.0d + """ + +def goTo(): + """ + goTo=double'd',double'd' + sends the antenna, while in TRACKING mode, to the specified Az-El position. + Example: goTo=180d,45d + The arguments are always rounded in the range 0-360 and 0-90 for azimuth and + elevation respectively (in any case the ranges are limited to mechanical contraints). + The jolly character is valid and is considered as: + keep the present value.The differences from the preset command are: + 1) once the antenna reaches the destination, the system will acknowledge + the "on source" status; + 2) the pointing corrections (pointing model and refraction) are applyed. + In case they are not required they must be turned off explicitly. + """ + +def haltSchedule(): + """ + haltSchedule completes the current scan and then stops the schedule + """ + +def help(command): + """ + help(command) + prints the `command`'s documentation. For instance: + + > help(calOn)' + calOn switches the calibration mark on + + When used without argument, it lists all the available commands: + + > help() + antennaPark + antennaReset + ... + """ + myself = __import__(__name__) + try: + cmd = getattr(myself, command) + return cmd.__doc__ + except Exception, ex: + print ex.message + print 'usage: help(command)' + print 'e.g. > help(setupCCB)' + print 'help() (without argument) lists all the available commands' + +def initialize(): + """ + initialize=code + (CCB, KKG, etc...) configures the backend using the default parameters relative to the + selected receiver. It does NOT act on the receiver, pointing model or antenna mount mode + """ + +def integration(): + """ + integration=N + sets the integration time + """ + +def log(): + """ + log=logfilename + allows the user to change the default logfile (named station.log). + logfilename have be indicated without extension. + When schedules are run, a new logfile is automatically started, + and it is named after the schedule: schedulename.log. + """ + +def lonlatOffsets(): + """ + lonlatOffsets=double'd',double'd' + sets the Galactic b-l offsets (degrees). They are intended "on sky". + + e.g. > lonlatOffsets=0.1d,0.5d + sets the galactic longitude offset to 0.1 degrees and the galactic + latitude offset to 0.5 degrees + """ + +def moon(): + """ + moon points the antenna to the present coordinates of the center of the Moon + """ + +def preset(): + """ + preset=double'd',double'd' + sends the antenna, if in PRESET mode, to the specified Az-El position, + without applying any pointing correction. This is useful when needing to point + to a position next to the zenith. Beware: the antenna will reach the destination + but no "on source" flag will be raised. + Example: preset=180d,45d + """ + +def project(): + """ + project=projectcode + sets the project code/name (a string assigned to the project by the TAC). + + (e.g. > project=scicom) + """ + +def radecOffsets(): + """ + radecOffsets=double'd',double'd' + sets the RA-Dec offsets (degrees). They are intended "on sky". + + e.g. > radecOffsets=0.3d,0.0d + sets the right ascension offset to 0.3 degrees and the elevation + offset to 0.0 degrees + """ + +def receiversMode(): + """ + receiversMode=code + configures the working mode of the receiver, according to its peculiar + characteristics + """ + +def receiversSetup(): + """ + receiversSetup=code + (CCB, KKG, etc...) configures the receiver using the default parameters. It does + NOT act on the backend, pointing model or antenna mount mode + """ + +def servoPark(): + """ + servoPark + brakes the minor servos + """ + +def servoSetup(): + """ + servoSetup=code + (CCB, KKG, LLP, PLP, PPP) configures the minor servos in ordet to put on focus the receiver + """ + +def setAttenuation(): + """ + setAttenuation=sect,att + sets to att (dB) the attenuator of section sect + """ + +def setLO(): + """ + setLO=freq + Local Oscillator frequency, in MHz (one per IF, separated by ";", usually the + values are identical) This LO frequency corresponds to: + SkyFreq(@band start) - 100 MHz when using the TPB + """ + +def setSection(): + """ + setSection=sect,startFreq,bw,feed,mode,sampleRate,bins + configures the backend section sect. + """ + +def setServoASConfiguration(): + """ + setServoASConfiguration=code + (ON, OFF) It enables (ON) or disable (OFF) the M2 active sufrace configuration + """ + +def setServoElevationTracking(): + """ + setServoElevationTracking=code + (ON, OFF) It enables (ON) or disable (OFF) the M2 corrections during elevation antenna movements + """ + +def setServoOffset(): + """ + setServoOffset=AXIS_CODE,VALUE + It sets the offset for a servo axis. + Allowed AXIS_CODEs: + SRP_TX, SRP_TY, SRP_TZ, SRP_RX, SRP_RY, SRP_RZ + PFP_RY, PFP_TX, PFP_TZ + GFR_RZ + M3R_RZ + + For instance, the following command sets an offset of 5mm in the x (virtual) axis of the in the SRP: + setServoOffset=SRP_TY,5 + """ + +def setupCCB(): + """ + The setup command sets the antenna mount, the minor servos, + the selected receiver and the default backend (TotalPower) + according to default parameters. + The antenna mode is set to ProgramTrack (allowing tracking + and the execution of schedules). Any time the mount mode is + switched to ProgramTrack, the antenna will slew and go to + the position which had been observed the last time the + ProgramTrack was active. This is normal, you can command a + different target or go on with other operations. + """ + +def setupKKG(): + pass # Documentation appened the and of this module + +def setupLLP(): + pass # Documentation appened the and of this module + +def setupPPP(): + pass # Documentation appened the and of this module + +def sidereal(): + """ + sidereal=sourcename,RA,Dec,epoch,sector + points to the supplied RA-Dec position and temporarily assigns the sourcename label to it. + Epoch can be '1950', '2000' or '-1', the last one meaning that the provided coordinates + are precessed to the observing epoch. The sector keyword forces the cable wrap + sector, if needed: its value can be 'cw', 'ccw' or 'neutral'. The last option means + the system will automatically choose the optimal alternative. + + e.g. > sidereal=src12,319.256d,70.864d,2000,neutral + """ + +def skydip(): + """ + skydip=El1,El2,duration + performs an OTF acquisition at the current azimuth position, spanning in + elevation from El1 to El2 (both expressed in degrees, with 'd' suffix), in duration seconds. + A recorded must have previously been enabled in order to save the data. + """ + +def startSchedule(): + """ + startSchedule=[project/]schedulename.scd,N + runs schedule schedulename.scd (project is the ID of the observing project, it is optional + if it has already been input through the projectCode command), reading it from line N + """ + +def stopSchedule(): + """ + stopSchedule immediately stops the running schedule, truncating the acquisition + """ + +def telescopePark(): + """ + telescopePark parks all the elements: mount (sending the antenna to + stow position), minor servo and active surface + """ + +def ti(): + """ + ti lists all the active temporized commands + """ + +def track(): + """ + track=source + if the antenna is in ProgramTrack mode and the sourcename is known + within the station catalogue (which includes the most commonly + observed calibrators), it directly points to the source and tracks it. + + e.g. > track=3c286 + """ + +def tsys(): + """ + tsys measures the system temperature (K) in the position the antenna is pointing to. + It returns a list of values, one for each section in use (e.g. 14 values for the whole MF receiver). + All the intermediate steps and calculations are stored in the active logfile + """ + +def wait(): + """ + wait=d.d + sets a delay (in seconds) which is applied before the system reads/executes the next command + """ + +def winkingMark(): + """ + winkingMark=[integer] + activates the winking (i.e. fast switching) calibration mark, whose period + in milliseconds is given as an integer parameter. To switch the mark off, + simply command a zero-ms period. This must always be done when the winking + mark is not needed anymore. For instance, to activate the mark so that is + alternately stays ON for 40 ms and OFF for 40 ms: + + > winkingMark=40 + + To switch the mark off: + + > winkingMark=0 + """ + +def wx(): + """ + wx returns the current weather parameters: ground temperature (Centigrade), relative humidity (%), + atmospheric pressure (hPa), wind speed (km/h). + """ + +import copy +myself = __import__(__name__) +# Create the commands dictionary +commands = myself.__dict__.copy() # Shallow copy, but we do not mind +for cmd in commands.keys(): + if cmd.startswith('__'): + del commands[cmd] + +# Make the setupXXX.__doc__ +for cmd in commands: + if cmd.startswith('setup'): + setupXXX = getattr(myself, cmd) + setupXXX.__doc__ = setupCCB.__doc__ + diff --git a/Common/Clients/SystemTerminal/src/operatorInput b/Common/Clients/SystemTerminal/src/operatorInput new file mode 100644 index 000000000..245b3cc8b --- /dev/null +++ b/Common/Clients/SystemTerminal/src/operatorInput @@ -0,0 +1,11 @@ +#! /bin/bash +# ********************************************************************************************* +# IRA Istituto di Radioastronomia +# +# This code is under GNU General Public Licence (GPL). +# +# Who when What +# Andrea Orlati(aorlati@ira.inaf.it) 26/07/2010 Creation +#************************************************************************ + +xterm -geometry 115x15+283+449 -sb -title OperatorInput -e /bin/bash --login -c "_tui_SysTerm $1" & diff --git a/Common/Clients/XBackendClient/.cproject b/Common/Clients/XBackendClient/.cproject new file mode 100644 index 000000000..6a40264b7 --- /dev/null +++ b/Common/Clients/XBackendClient/.cproject @@ -0,0 +1,718 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Clients/XBackendClient/.project b/Common/Clients/XBackendClient/.project new file mode 100644 index 000000000..04f9dfdea --- /dev/null +++ b/Common/Clients/XBackendClient/.project @@ -0,0 +1,82 @@ + + + XBackendsClient + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/XBackendsClient/src} + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + false + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + + + + + + org.eclipse.cdt.core.ccnature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.cnature + + diff --git a/Common/Clients/XBackendClient/include/Data.h b/Common/Clients/XBackendClient/include/Data.h new file mode 100644 index 000000000..60a798ba2 --- /dev/null +++ b/Common/Clients/XBackendClient/include/Data.h @@ -0,0 +1,150 @@ +#ifndef DATA_H +#define DATA_H + +/** + * + * Osservatorio Astrofisico di Arcetri + * + * This code is under GNU General Public Licence (GPL). + * + * Who when What + * Liliana Branciforti(bliliana@arcetri.astro.it) 10/03/2009 Creation + */ + +#include "headResult.h" +#include +#include +#include + + +/** + * This class includes all information necessary to administrate HW and specific + * This class contain two object HeadResult, this permit to configure HW + * in Full or single polarimetric Mode section and furthermore put together two section + * single polarimetric Mode. + * It also maintain all information for single integration. + */ + +class Data +{ +public: + /** + * Constructor + */ + Data ( ); + + /** + * Destructor. + */ + virtual ~Data ( ); + + /** + * This method set primary header. + * @param var is the value to set. + */ + void SetIntestazioneCh1 ( HeadResult var ) { intestazioneCh1 = var; } + + /** + * This method get the value of primary header + * @return a value of primary header + */ + HeadResult GetIntestazioneCh1 ( ) { return intestazioneCh1; } + + /** + * This method set the value of secondary header. + * @param var is the value to set. + */ + void SetIntestazioneCh2 ( HeadResult var ) { intestazioneCh2 = var; } + + /** + * This method get the value of secondary header + * @return a value of secondary header + */ + HeadResult GetIntestazioneCh2 ( ) { return intestazioneCh2; } + + /** + * This method set the value of UT time beginning of integration. + * @param var is the value to set. + */ + void SetUtInizio ( timeb var ) { utInizio = var; } + + /** + * This method get the value of UT time beginning of integration + * @return a value of UT time beginning of integration + */ + timeb GetUtInizio ( ) { return utInizio; }//Get the value of utInizio + + /** + * This method set the value of UT time ending of integration. + * @param var is the value to set. + */ + void SetUtFine ( timeb new_var ) { utFine = new_var; } + + /** + * This method get the value of UT time ending of integration + * @return a value of UT time ending of integration + */ + timeb GetUtFine ( ) { return utFine; } + + /** + * This method set the value of pointer of area of memory to store + * results of integration + * @param var is the value to set. + */ + void SetBuffer ( long* var ) { buffer=var; } + + /** + * This method get the value of pointer of area of memory to store + * results of integration + * @return a value of buffer is a pointer + */ + long* GetBuffer ( ) { return buffer; } + + /** + * This method set the value of sizeBuff is the size of area of memory. + * @param var is the value to set. + */ + void SetSizeBuffer ( int var ) { sizeBuff=var; } + + /** + * This method get the value of sizeBuff is the size of area of memory. + * @return a value of sizeBuff is the size of area of memory. + */ + int GetSizeBuffer ( ) { return sizeBuff; } + + /** + * This method set the value of flag Overflow. + * @param var is the value to set. + */ + void SetOverflow ( bool var ) { Overflow=var; } + + /** + * This method get the value of flag Overflow + * @return a value of flag Overflow + */ + bool GetOverflow ( ) { return Overflow; } + + /** + * This method setting each elemento of class at zero + */ + void SetZeroData (); + +protected: + long* buffer;/*! +#include +#include "headResult.h" +#include "Specifiche.h" +#include "Data.h" +#include +#include +#include + +using namespace std; + +/** + * This class includes all information of each single integration + * and the results store in the vectore struct. + */ + +class DataIntegrazione +{ +public: + /** + * Constructor + */ + DataIntegrazione ( ); + + /** + * Destructor. + */ + virtual ~DataIntegrazione ( ); + + /** + * This method set the value of flag Overflow. + * @param var is the value to set. + */ + void SetOverflow ( bool var ) { Overflow=var; } + + /** + * This method get the value of flag Overflow + * @return a value of flag Overflow + */ + bool GetOverflow ( ) { return Overflow; } + + /** + * This method set header. + * @param var is the value to set. + */ + void SetHead ( HeadResult var ) { head = var; } + + /** + * This method get the value of header + * @return a value of header + */ + HeadResult GetHead ( ) { return head; } + + /** + * This method set the value of integration time. + * @param var is the value to set. + */ + void SetTempoIntegrazione ( int var ) { tempoIntegrazione = var; } + + /** + * This method get the value of integration time. + * @return a value of integration time. + */ + int GetTempoIntegrazione ( ) { return tempoIntegrazione; } + + /** + * This method set the value of flag Modo8bit. + * @param var is the value to set. + */ + void SetModo8Bit ( bool var ) { modo8Bit = var; } + + /** + * This method get the value of flag Modo8bit + * @return a value of flag Modo8bit + */ + bool GetModo8Bit ( ) { return modo8Bit; } + + /** + * This method set the value of UT time beginning of integration + * it take by system clock + */ + void SetUtInizio ( ) { + timeb timebuffer; + ftime( &timebuffer ); + utInizio = timebuffer; } + + /** + * This method get the value of UT time beginning of integration + * @return a value of UT time beginning of integration + */ + timeb GetUtInizio ( ) { return utInizio; } + + /** + * This method set the value of UT time ending of integration. + * it take by system clock + */ + void SetUtFine ( ) { + timeb timebuffer; + ftime( &timebuffer ); + utFine = timebuffer; + } + + /** + * This method get the value of UT time ending of integration + * @return a value of UT time ending of integration + */ + timeb GetUtFine ( ) { return utFine; } + + /** + * This method set the value of flag ValoriValidi + * @return a value of flag ValoriValidi + */ + void SetValoriValidi ( bool new_var ) { ValoriValidi = new_var; } + + /** + * This method get the value of flag ValoriValidi + * @return a value of flag ValoriValidi + */ + bool GetValoriValidi ( ) { return ValoriValidi; } + + /** + * This method set the value of NArrayDati + * @param var is the value to set. + */ + void SetNArrayDati ( int var ) { nArrayDati = var; } + + /** + * This method get the value of NArrayDati + * @return a value of NArrayDati + */ + int GetNArrayDati ( ) { return nArrayDati; } + + /** + * This method set the value of lungArrayDati. + * @param var is the value to set. + */ + void SetLungArrayDati ( int var ) { lungArrayDati = var; } + + /** + * This method get the value of lungArrayDati + * @return a value of lungArrayDati + */ + int GetLungArrayDati ( ) { return lungArrayDati; } + + /** + * This method get the value of vector xx + * @return a value of vector xx + */ + vector GetXx ( ) { return xx; } + /** + * This method get the value of vector yy + * @return a value of vector yy + */ + vector GetYy ( ) { return yy; } + /** + * This method get the value of vector xy + * @return a value of vector xy + */ + vector > GetXy ( ) { return xy; } + /** + * This method get the value of vector tp + * @return a value of vector tp + */ + vector GetTp( ) { return tp; } + + /** + * This method setting each elemento of class at zero + */ + void SetZeroDataIntegratione ( ); + + /** + * This method set the value of each elemnto of vector xx a zero + */ + void SetXxZero ( ); + + /** + * This method set the value of each elemnto of vector yy a zero + */ + void SetYyZero ( ); + + /** + * This method set the value of each element of vector xy a zero + */ + void SetXyZero ( ); + + /** + * This method set the value of each element of vector tp a zero + */ + void SetTpZero ( ); + + /** + * This method set the value of each element of vector xx + */ + void SetXx ( double *buff); + + /** + * This method set the value of each element of vector xx + * This method is used when two section single polarimetric mode are unifid + */ + void SetXx2( long *buff); + + /** + * This method set the value of each element of vector yy + */ + void SetYy ( double *buff); + + /** + * This method set the value of each element of vector xy + */ + void SetXy ( double *buff); + + /** + * This method set the value of each element of vector tp a zero + * @param buff is a pointer of area of memory that contain data + * @param size is the dimention of buffer + * @param modo specify the type of data + */ + void SetTp ( double *buff, int size, bool modo); + + vector xx;/*!< data of integration single and full mode*/ + vector yy;/*!< data of integration single mode*/ + vector > xy;/*!< data of integration full mode*/ + vector tp;/*!< data of total power*/ + HeadResult head;/*!< header of object */ + +private: + int tempoIntegrazione;/*!< time of integration*/ + bool modo8Bit;/*!< type of integration*/ + timeb utInizio;/*!< UT time of beginning integration*/ + timeb utFine;/*!< UT time of ending integration*/ + bool ValoriValidi;/*!< flag that confirm the validity of data */ + int nArrayDati;/*!< number of type of data */ + int lungArrayDati;/*!< size of data store*/ + bool Overflow;/*!< overflow flag of results of integrazion*/ + + /** + * The initAttributes method attempts to initialize the object on create + */ + void initAttributes ( ) ; + +}; + +#endif // DATAINTEGRAZIONE_H + + diff --git a/Common/Clients/XBackendClient/include/Led.h b/Common/Clients/XBackendClient/include/Led.h new file mode 100644 index 000000000..dcf9a5991 --- /dev/null +++ b/Common/Clients/XBackendClient/include/Led.h @@ -0,0 +1,81 @@ +#ifndef LED_H_ +#define LED_H_ + +/** + * + * Osservatorio Astrofisico di Arcetri + * + * This code is under GNU General Public Licence (GPL). + * + * Who when What + * Liliana Branciforti(bliliana@arcetri.astro.it) 01/10/2009 Creation + */ + +#include +#include +#include + +/** +* Sometimes you find yourself needing an indicator to reflect various statuses. +* The Led class is a QWidget control for a LED control and is union of the QIcon and QLabel class. +* The code assumes LEDs of 18 X 18 pixels. +* +* Using the Led class is very simple +* 1. Insert a new QWidget frame where you want the LED. +* 2. Rename the QWidget frame to somthing other than myLed. +* 3. In the code create e new object call to the reference ui.myLed +* 4. Make sure that you include Led.h +*/ +class Led +{ +public: + + /** + * \enum color + * The color enum is define a specific color of the icon Led class. + * An color may be either Green, Red or Yellow + */ + enum color{ Green, Red, Yellow }; + + /** + * \enum mode + * The mode enum is define a specific state of color of the icon Led class. + * An mode may be either On or Off + */ + enum mode{ On,Off }; + + /** + * Constructor. + * @param parent is the reference at the QWidget on the Dialog + * @param str is the string Label that describes the function of the Led. The default is empty. + * @param attrt is the color to creation the Led. The default is Led::Green. + * @param modt is the mode to creation the Led. The default is Led::On. + */ + Led(QWidget * parent = 0,QString str="",color attrt=Green, mode modt=On); + + /** + * Destructor. + */ + virtual ~Led(); + + /** + * The setColor method attempts to set or reset the color of the Led. + * @param attrt + */ + void setColor(color attrt); + /** + * The setMode method attempts to set or reset the mode of the Led. + * @param modt + */ + void setMode(mode modt); + +private: + QLabel *lab;/*!< The pointer to icon QLabel of led object */ + QLabel *labT;/*!< The pointer to texst QLabel of led object */ + color attr;/*!< The color led object */ + mode mod; /*!< The mode led object */ + QIcon *icon;/*!< The pointer to icon led object */ + QString text;/*!< The describe string led object */ +}; + +#endif /*LED_H_*/ diff --git a/Common/Clients/XBackendClient/include/Specifiche.h b/Common/Clients/XBackendClient/include/Specifiche.h new file mode 100644 index 000000000..3e87dae49 --- /dev/null +++ b/Common/Clients/XBackendClient/include/Specifiche.h @@ -0,0 +1,136 @@ +#ifndef SPECIFICHE_H +#define SPECIFICHE_H + +/** + * + * Osservatorio Astrofisico di Arcetri + * + * This code is under GNU General Public Licence (GPL). + * + * Who when What + * Liliana Branciforti(bliliana@arcetri.astro.it) 10/03/2009 Creation + */ + +#include "headResult.h" +#include +#include + +using namespace std; + + +/** + * class Specifiche + * This class includes all information necessary to describe the specific + * of a integration + */ + +class Specifiche +{ +public: + /** + * Constructor + */ + Specifiche ( ); + + /** + * Destructor. + */ + virtual ~Specifiche ( ); + int tempoEle; /*!=0)&&(new_var<6)) FunctionAdc = new_var; + else FunctionAdc=0;} + /** + * The GetFunctionAdc method attempts to get the setting type of Function ADCMode + * This method is only in available server version xarcos + * @return a value of current setting of Function ADCMode. + */ + int GetFunctionAdc ( ) { return FunctionAdc; } + +public: + vector specificaSezione; /*! +#include "xclientGUI.h" + +#include "headResult.h" +#include "Specifiche.h" +#ifndef COMPONENTTEXTCLIENTTEMPLATE_H +#define COMPONENTTEXTCLIENTTEMPLATE_H + + +/* Add the component skeleton header file */ +/* ************************************* */ +#include +/* ************************************* */ + +/* Add the component errors header file */ +/* ************************************* */ +#include +#include +/* ************************************* */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define GRAY_COLOR 0 +#define BLUE_GRAY 0 +#define GRAY_BLUE 1 +#define BLACK_RED 2 +#define BLACK_GREEN 3 +#define BLACK_YELLOW 4 +#define BLACK_BLUE 5 +#define BLACK_MAGENTA 6 +#define BLACK_WHITE 7 + +/* define the max number of arguments that can be passed to component methods */ +/* ************************************************************************** */ +#define MAXFIELDNUMBER 10 +/* ************************************************************************** */ + +/* define the main frame dimension */ +/* ******************************* */ +#define WINDOW_WIDTH 79 /*columns */ +#define WINDOW_HEIGHT 28 /* rows */ +/* ******************************* */ + +/* define the routine name here, to be used for logging */ +/* **************************************************** */ +#define MODULE_NAME "genericBackendGui" /* the name of this module (filename without .cpp) */ +/* **************************************************** */ + +/* define the application title and style */ +/* ************************************* */ +#define APPLICATION_TITLE "GenericBackend" /* the title of the main frame */ +#define TITLE_COLOR_PAIR CColorPair::RED_BLACK /* the title color and background */ +#define TITLE_STYLE CStyle::BOLD|CStyle::UNDERLINE /* the title style */ +/* ************************************* */ + +/* define name and component interface */ +/* ********************************** */ +//#define COMPONENT_NAME "BACKENDS/TotalPower" /* the name of the istantiation of the component */ +#define COMPONENT_IDL_MODULE Backends /* the IDL module that contains the component interface */ +#define COMPONENT_IDL_INTERFACE GenericBackend /* the IDL interface of the component */ +#define COMPONENT_SMARTPOINTER GenericBackend_var /* the component type */ +/* ********************************** */ + +/* define user input command style */ +/* ******************************* */ +#define USER_INPUT_COLOR_PAIR BLUE_GRAY /* user input color and background */ +#define USER_INPUT_STYLE CStyle::NORMAL /* user input style */ +/* ******************************* */ + +/* define output field look and feel */ +/* ********************************* */ +#define USE_OUTPUT_FIELD 1 /* 0 disable the output field */ +#define OUTPUT_FIELD_COLOR_PAIR GRAY_BLUE /* output field color and background */ +#define OUTPUT_FIELD_STYLE CStyle::NORMAL /* output field style */ +#define OUTPUT_FIELD_HEIGHT 4 /* output field height (number of rows) */ +/* ********************************* */ + +/* define this value (milliseconds) to set the log guard interval */ +#define GUARDINTERVAL 1000 +/* to send the client to sleep for a certain ammount of time, setup this value (milliseconds) */ +#define MAINTHREADSLEEPTIME 250 + +#endif + +class XBackendsClient +{ +public: + XBackendsClient(QWidget *parent = 0); + virtual ~XBackendsClient(); + +private: + //Ui_ClientClass ui; +}; + +#endif /*XBACKENDSCLIENT_H_*/ diff --git a/Common/Clients/XBackendClient/include/XControlSystem.h b/Common/Clients/XBackendClient/include/XControlSystem.h new file mode 100644 index 000000000..87ff2146a --- /dev/null +++ b/Common/Clients/XBackendClient/include/XControlSystem.h @@ -0,0 +1,57 @@ +// System includes + +// ACS includes +#include +#include +#include +#include "XBackendsC.h" +#include +#include +#include +#include + +// QT includes +#include +#include +#include +#include +#include +#include +// QT includes +#include +#include + +#define MONITOR_TIME_TRIGGER 10000000 // 1 second + + +class XControlSystem : public QThread, public virtual POA_ACS::CBpattern +{ + Q_OBJECT + +public: + bool BUSY; + CString NameFile; + XControlSystem(QObject *parent = 0); + ~XControlSystem(){ }; + + void setSimpleClient(maci::SimpleClient*); + void setSender(Backends::XBackends_var); + void setRecv(Management::FitsWriter_var); + void run(); + void stop(); + + void working(ACS::pattern value, const ACSErr::Completion &c, const ACS::CBDescOut &desc) throw (CORBA::SystemException); + void done(ACS::pattern value, const ACSErr::Completion &c, const ACS::CBDescOut &desc) throw (CORBA::SystemException); + CORBA::Boolean negotiate(ACS::TimeInterval time_to_transmit, const ACS::CBDescOut &desc) throw (CORBA::SystemException) { + return true;} + + signals: + void upState( char status ); + +private: + maci::SimpleClient* sc; + bool eventEnd; + Backends::XBackends_var tSender; + Management::FitsWriter_var tRecv; + void setGUIAntennaMountStatus(ACS::pattern); +}; diff --git a/Common/Clients/XBackendClient/include/headResult.h b/Common/Clients/XBackendClient/include/headResult.h new file mode 100644 index 000000000..8d840bea8 --- /dev/null +++ b/Common/Clients/XBackendClient/include/headResult.h @@ -0,0 +1,134 @@ +#ifndef HEADRESULT_H +#define HEADRESULT_H + +/** + * + * Osservatorio Astrofisico di Arcetri + * + * This code is under GNU General Public Licence (GPL). + * + * Who when What + * Liliana Branciforti(bliliana@arcetri.astro.it) 10/03/2009 Creation + */ + +#include + +using namespace std; + +/** + * class HeadResult + * This class includes all information necessary to describe a section + */ + +class HeadResult +{ +public: + /** + * Constructor + */ + HeadResult ( ); + + /** + * Destructor. + */ + virtual ~HeadResult ( ); + + /** + * This method set the value of frequency. + * @param var is the value to set. + */ + void SetFlo (double var) { flo = var;} + + /** + * This method get the value of frequency + * @return a value of frequency + */ + double GetFlo ( ) { return flo; } + + /** + * This method set the value of band + * @param var is the value to set. + */ + void SetBanda ( double var ) { banda = var; } + + /** + * This method get the value of band + * @return a value of band + */ + double GetBanda ( ) { return banda; } + + /** + * This method set the value of gain + * @param var is the value to set. + */ + void SetGain ( double var ) { gain = var; } + + /** + * This method get the value of gain + * @return a value of gain + */ + double GetGain ( ) { return gain; } + + /** + * This method set the value of adc + * @param var is the value to set. + */ + void SetAdc ( int var ) { adc = var; } + + /** + * This method get the value of adc + * @return a value of adc + */ + int GetAdc ( ) { return adc; } + + /** + * This method set the value of index + * @param var is the value to set. + */ + void Setindex ( int var ) { index = var; } + + /** + * This method get the value of index + * @return a value of index + */ + int Getindex ( ) { return index; } + + /** + * This method set the value of modoPol + * @param var is the value to set. + */ + void SetModoPol ( bool var ) { modoPol = var; } + + /** + * This method get the value of modoPol + * @return a value of modoPol + */ + bool GetModoPol ( ) { return modoPol; } + + /** + * This method setting each elemento of class at zero + */ + void SetZeroHeadResult ( ); + + /** + * Operator + */ + bool operator==( const HeadResult & second) const; + bool operator!=( const HeadResult & second) const; + +private: + double flo;/*!< frequency of current object section */ + double banda;/*! + +class QwtPlotCurve; + +class Plot: public QwtPlot +{ +// Q_OBJECT +public: + /** + * Constructor. + * @param parent is the reference at the QWidget on the Dialog. + */ + Plot(QWidget *parent); + + public slots: + /** + * The set method attempts to display two curve. + * @param *x array of values of abscissa of the curve + * @param *y1 array of values of Order of the first curve + * @param *y2 array of values of Order of the second curve + * @param count is the number of points to draw + */ + void setDamp(double *x, double *y1, int count); + void setDamp(double *x, double *y1,double *y2, int count); + void setDamp(double *x, double *y1,double *y2, double *y3, double *y4, int count); + private: + /** + * The showData method attempts to display two curve. + * @param *x array of values of abscissa of the curve + * @param *y1 array of values of Order of the first curve + * @param *y2 array of values of Order of the second curve + * @param count is the number of points to draw + */ + void showData(double *x,double *y1, int count); + void showData(double *x,double *y1, double *y2, int count); + void showData(double *x,double *y1, double *y2, double *y3, double *y4, int count); + + QwtPlotCurve *d_crv1;/*!< The Pointer QwtPlotCurve in the Plot object */ + QwtPlotCurve *d_crv2;/*!< The Pointer QwtPlotCurve in the Plot object */ + QwtPlotCurve *d_crv3;/*!< The Pointer QwtPlotCurve in the Plot object */ + QwtPlotCurve *d_crv4;/*!< The Pointer QwtPlotCurve in the Plot object */ +}; + +#endif // PLOT_H diff --git a/Common/Clients/XBackendClient/include/xclientGUI.h b/Common/Clients/XBackendClient/include/xclientGUI.h new file mode 100644 index 000000000..d9d2c1946 --- /dev/null +++ b/Common/Clients/XBackendClient/include/xclientGUI.h @@ -0,0 +1,526 @@ +/******************************************************************************** +** Form generated from reading ui file 'xclientGUI.ui' +** +** Created: Fri May 21 18:12:31 2010 +** by: Qt User Interface Compiler version 4.3.4 +** +** WARNING! All changes made in this file will be lost when recompiling ui file! +********************************************************************************/ + +#ifndef XCLIENTGUI_H +#define XCLIENTGUI_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Ui_ClientClass +{ +public: + QAction *action_Exit; + QAction *actionXPlot; + QWidget *centralwidget; + QGridLayout *gridLayout; + QSpacerItem *spacerItem; + QHBoxLayout *hboxLayout; + QVBoxLayout *vboxLayout; + QGroupBox *groupBoxSetting; + QGridLayout *gridLayout1; + QHBoxLayout *hboxLayout1; + QVBoxLayout *vboxLayout1; + QLabel *label; + QLineEdit *freqLine; + QVBoxLayout *vboxLayout2; + QLabel *label_2; + QSpinBox *gainBox; + QVBoxLayout *vboxLayout3; + QLabel *label_3; + QSpinBox *ChInBox; + QVBoxLayout *vboxLayout4; + QLabel *label_6; + QComboBox *bandBox; + QVBoxLayout *vboxLayout5; + QCheckBox *ModoPol; + QHBoxLayout *hboxLayout2; + QLabel *label_7; + QLineEdit *SezioneCorrente; + QToolButton *pushButtonPrec; + QToolButton *pushButtonSucc; + QSpacerItem *spacerItem1; + QPushButton *pushButtonBroad; + QHBoxLayout *hboxLayout3; + QLabel *label_9; + QLineEdit *intTimeLine; + QLabel *label_10; + QSpinBox *repeatBox; + QCheckBox *Modo8Bit; + QHBoxLayout *hboxLayout4; + QGroupBox *groupBoxStatus; + QGridLayout *gridLayout2; + QWidget *Busy; + QWidget *Abort; + QWidget *Active; + QWidget *Setting; + QWidget *Overflow; + QWidget *Data; + QWidget *HW; + QHBoxLayout *hboxLayout5; + QSpacerItem *spacerItem2; + QGridLayout *gridLayout3; + QPushButton *pushButtonInt; + QPushButton *pushButtonAbort; + QPushButton *pushButtonStart; + QSpacerItem *spacerItem3; + QMenuBar *menubar; + QMenu *menu_View; + QMenu *menu_File; + QStatusBar *statusbar; + + void setupUi(QMainWindow *ClientClass) + { + if (ClientClass->objectName().isEmpty()) + ClientClass->setObjectName(QString::fromUtf8("ClientClass")); + ClientClass->resize(703, 379); + action_Exit = new QAction(ClientClass); + action_Exit->setObjectName(QString::fromUtf8("action_Exit")); + actionXPlot = new QAction(ClientClass); + actionXPlot->setObjectName(QString::fromUtf8("actionXPlot")); + centralwidget = new QWidget(ClientClass); + centralwidget->setObjectName(QString::fromUtf8("centralwidget")); + gridLayout = new QGridLayout(centralwidget); +#ifndef Q_OS_MAC + gridLayout->setSpacing(6); +#endif +#ifndef Q_OS_MAC + gridLayout->setMargin(9); +#endif + gridLayout->setObjectName(QString::fromUtf8("gridLayout")); + spacerItem = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding); + + gridLayout->addItem(spacerItem, 1, 0, 1, 1); + + hboxLayout = new QHBoxLayout(); +#ifndef Q_OS_MAC + hboxLayout->setSpacing(6); +#endif +#ifndef Q_OS_MAC + hboxLayout->setMargin(0); +#endif + hboxLayout->setObjectName(QString::fromUtf8("hboxLayout")); + vboxLayout = new QVBoxLayout(); +#ifndef Q_OS_MAC + vboxLayout->setSpacing(6); +#endif +#ifndef Q_OS_MAC + vboxLayout->setMargin(0); +#endif + vboxLayout->setObjectName(QString::fromUtf8("vboxLayout")); + groupBoxSetting = new QGroupBox(centralwidget); + groupBoxSetting->setObjectName(QString::fromUtf8("groupBoxSetting")); + gridLayout1 = new QGridLayout(groupBoxSetting); +#ifndef Q_OS_MAC + gridLayout1->setSpacing(6); +#endif +#ifndef Q_OS_MAC + gridLayout1->setMargin(9); +#endif + gridLayout1->setObjectName(QString::fromUtf8("gridLayout1")); + hboxLayout1 = new QHBoxLayout(); +#ifndef Q_OS_MAC + hboxLayout1->setSpacing(6); +#endif +#ifndef Q_OS_MAC + hboxLayout1->setMargin(0); +#endif + hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1")); + vboxLayout1 = new QVBoxLayout(); +#ifndef Q_OS_MAC + vboxLayout1->setSpacing(6); +#endif +#ifndef Q_OS_MAC + vboxLayout1->setMargin(0); +#endif + vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1")); + label = new QLabel(groupBoxSetting); + label->setObjectName(QString::fromUtf8("label")); + + vboxLayout1->addWidget(label); + + freqLine = new QLineEdit(groupBoxSetting); + freqLine->setObjectName(QString::fromUtf8("freqLine")); + + vboxLayout1->addWidget(freqLine); + + + hboxLayout1->addLayout(vboxLayout1); + + vboxLayout2 = new QVBoxLayout(); +#ifndef Q_OS_MAC + vboxLayout2->setSpacing(6); +#endif + vboxLayout2->setMargin(0); + vboxLayout2->setObjectName(QString::fromUtf8("vboxLayout2")); + label_2 = new QLabel(groupBoxSetting); + label_2->setObjectName(QString::fromUtf8("label_2")); + + vboxLayout2->addWidget(label_2); + + gainBox = new QSpinBox(groupBoxSetting); + gainBox->setObjectName(QString::fromUtf8("gainBox")); + gainBox->setMaximum(255); + gainBox->setValue(20); + + vboxLayout2->addWidget(gainBox); + + + hboxLayout1->addLayout(vboxLayout2); + + vboxLayout3 = new QVBoxLayout(); +#ifndef Q_OS_MAC + vboxLayout3->setSpacing(6); +#endif + vboxLayout3->setMargin(0); + vboxLayout3->setObjectName(QString::fromUtf8("vboxLayout3")); + label_3 = new QLabel(groupBoxSetting); + label_3->setObjectName(QString::fromUtf8("label_3")); + + vboxLayout3->addWidget(label_3); + + ChInBox = new QSpinBox(groupBoxSetting); + ChInBox->setObjectName(QString::fromUtf8("ChInBox")); + ChInBox->setMaximum(15); + + vboxLayout3->addWidget(ChInBox); + + + hboxLayout1->addLayout(vboxLayout3); + + vboxLayout4 = new QVBoxLayout(); +#ifndef Q_OS_MAC + vboxLayout4->setSpacing(6); +#endif + vboxLayout4->setMargin(0); + vboxLayout4->setObjectName(QString::fromUtf8("vboxLayout4")); + label_6 = new QLabel(groupBoxSetting); + label_6->setObjectName(QString::fromUtf8("label_6")); + + vboxLayout4->addWidget(label_6); + + bandBox = new QComboBox(groupBoxSetting); + bandBox->setObjectName(QString::fromUtf8("bandBox")); + + vboxLayout4->addWidget(bandBox); + + + hboxLayout1->addLayout(vboxLayout4); + + vboxLayout5 = new QVBoxLayout(); +#ifndef Q_OS_MAC + vboxLayout5->setSpacing(6); +#endif + vboxLayout5->setMargin(0); + vboxLayout5->setObjectName(QString::fromUtf8("vboxLayout5")); + ModoPol = new QCheckBox(groupBoxSetting); + ModoPol->setObjectName(QString::fromUtf8("ModoPol")); + ModoPol->setChecked(true); + + vboxLayout5->addWidget(ModoPol); + + + hboxLayout1->addLayout(vboxLayout5); + + + gridLayout1->addLayout(hboxLayout1, 0, 0, 1, 1); + + hboxLayout2 = new QHBoxLayout(); +#ifndef Q_OS_MAC + hboxLayout2->setSpacing(6); +#endif + hboxLayout2->setMargin(0); + hboxLayout2->setObjectName(QString::fromUtf8("hboxLayout2")); + label_7 = new QLabel(groupBoxSetting); + label_7->setObjectName(QString::fromUtf8("label_7")); + + hboxLayout2->addWidget(label_7); + + SezioneCorrente = new QLineEdit(groupBoxSetting); + SezioneCorrente->setObjectName(QString::fromUtf8("SezioneCorrente")); + SezioneCorrente->setMaximumSize(QSize(31, 16777215)); + SezioneCorrente->setReadOnly(true); + + hboxLayout2->addWidget(SezioneCorrente); + + pushButtonPrec = new QToolButton(groupBoxSetting); + pushButtonPrec->setObjectName(QString::fromUtf8("pushButtonPrec")); + + hboxLayout2->addWidget(pushButtonPrec); + + pushButtonSucc = new QToolButton(groupBoxSetting); + pushButtonSucc->setObjectName(QString::fromUtf8("pushButtonSucc")); + + hboxLayout2->addWidget(pushButtonSucc); + + spacerItem1 = new QSpacerItem(278, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + hboxLayout2->addItem(spacerItem1); + + pushButtonBroad = new QPushButton(groupBoxSetting); + pushButtonBroad->setObjectName(QString::fromUtf8("pushButtonBroad")); + + hboxLayout2->addWidget(pushButtonBroad); + + + gridLayout1->addLayout(hboxLayout2, 1, 0, 1, 1); + + + vboxLayout->addWidget(groupBoxSetting); + + hboxLayout3 = new QHBoxLayout(); +#ifndef Q_OS_MAC + hboxLayout3->setSpacing(6); +#endif + hboxLayout3->setMargin(0); + hboxLayout3->setObjectName(QString::fromUtf8("hboxLayout3")); + label_9 = new QLabel(centralwidget); + label_9->setObjectName(QString::fromUtf8("label_9")); + + hboxLayout3->addWidget(label_9); + + intTimeLine = new QLineEdit(centralwidget); + intTimeLine->setObjectName(QString::fromUtf8("intTimeLine")); + + hboxLayout3->addWidget(intTimeLine); + + label_10 = new QLabel(centralwidget); + label_10->setObjectName(QString::fromUtf8("label_10")); + + hboxLayout3->addWidget(label_10); + + repeatBox = new QSpinBox(centralwidget); + repeatBox->setObjectName(QString::fromUtf8("repeatBox")); + repeatBox->setReadOnly(true); + + hboxLayout3->addWidget(repeatBox); + + Modo8Bit = new QCheckBox(centralwidget); + Modo8Bit->setObjectName(QString::fromUtf8("Modo8Bit")); + Modo8Bit->setEnabled(false); + Modo8Bit->setCheckable(false); + Modo8Bit->setChecked(false); + + hboxLayout3->addWidget(Modo8Bit); + + + vboxLayout->addLayout(hboxLayout3); + + hboxLayout4 = new QHBoxLayout(); +#ifndef Q_OS_MAC + hboxLayout4->setSpacing(6); +#endif + hboxLayout4->setMargin(0); + hboxLayout4->setObjectName(QString::fromUtf8("hboxLayout4")); + + vboxLayout->addLayout(hboxLayout4); + + + hboxLayout->addLayout(vboxLayout); + + groupBoxStatus = new QGroupBox(centralwidget); + groupBoxStatus->setObjectName(QString::fromUtf8("groupBoxStatus")); + groupBoxStatus->setMinimumSize(QSize(140, 210)); + gridLayout2 = new QGridLayout(groupBoxStatus); +#ifndef Q_OS_MAC + gridLayout2->setSpacing(6); +#endif +#ifndef Q_OS_MAC + gridLayout2->setMargin(9); +#endif + gridLayout2->setObjectName(QString::fromUtf8("gridLayout2")); + Busy = new QWidget(groupBoxStatus); + Busy->setObjectName(QString::fromUtf8("Busy")); + + gridLayout2->addWidget(Busy, 6, 0, 1, 1); + + Abort = new QWidget(groupBoxStatus); + Abort->setObjectName(QString::fromUtf8("Abort")); + + gridLayout2->addWidget(Abort, 5, 0, 1, 1); + + Active = new QWidget(groupBoxStatus); + Active->setObjectName(QString::fromUtf8("Active")); + + gridLayout2->addWidget(Active, 4, 0, 1, 1); + + Setting = new QWidget(groupBoxStatus); + Setting->setObjectName(QString::fromUtf8("Setting")); + + gridLayout2->addWidget(Setting, 3, 0, 1, 1); + + Overflow = new QWidget(groupBoxStatus); + Overflow->setObjectName(QString::fromUtf8("Overflow")); + + gridLayout2->addWidget(Overflow, 2, 0, 1, 1); + + Data = new QWidget(groupBoxStatus); + Data->setObjectName(QString::fromUtf8("Data")); + + gridLayout2->addWidget(Data, 1, 0, 1, 1); + + HW = new QWidget(groupBoxStatus); + HW->setObjectName(QString::fromUtf8("HW")); + + gridLayout2->addWidget(HW, 0, 0, 1, 1); + + + hboxLayout->addWidget(groupBoxStatus); + + + gridLayout->addLayout(hboxLayout, 0, 0, 1, 1); + + hboxLayout5 = new QHBoxLayout(); +#ifndef Q_OS_MAC + hboxLayout5->setSpacing(6); +#endif + hboxLayout5->setMargin(0); + hboxLayout5->setObjectName(QString::fromUtf8("hboxLayout5")); + spacerItem2 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + hboxLayout5->addItem(spacerItem2); + + gridLayout3 = new QGridLayout(); +#ifndef Q_OS_MAC + gridLayout3->setSpacing(6); +#endif +#ifndef Q_OS_MAC + gridLayout3->setMargin(0); +#endif + gridLayout3->setObjectName(QString::fromUtf8("gridLayout3")); + pushButtonInt = new QPushButton(centralwidget); + pushButtonInt->setObjectName(QString::fromUtf8("pushButtonInt")); + + gridLayout3->addWidget(pushButtonInt, 1, 0, 1, 1); + + pushButtonAbort = new QPushButton(centralwidget); + pushButtonAbort->setObjectName(QString::fromUtf8("pushButtonAbort")); + pushButtonAbort->setEnabled(false); + + gridLayout3->addWidget(pushButtonAbort, 1, 1, 1, 1); + + pushButtonStart = new QPushButton(centralwidget); + pushButtonStart->setObjectName(QString::fromUtf8("pushButtonStart")); + pushButtonStart->setEnabled(false); + + gridLayout3->addWidget(pushButtonStart, 0, 1, 1, 1); + + + hboxLayout5->addLayout(gridLayout3); + + spacerItem3 = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + hboxLayout5->addItem(spacerItem3); + + + gridLayout->addLayout(hboxLayout5, 2, 0, 1, 1); + + ClientClass->setCentralWidget(centralwidget); + menubar = new QMenuBar(ClientClass); + menubar->setObjectName(QString::fromUtf8("menubar")); + menubar->setGeometry(QRect(0, 0, 703, 25)); + menu_View = new QMenu(menubar); + menu_View->setObjectName(QString::fromUtf8("menu_View")); + menu_File = new QMenu(menubar); + menu_File->setObjectName(QString::fromUtf8("menu_File")); + ClientClass->setMenuBar(menubar); + statusbar = new QStatusBar(ClientClass); + statusbar->setObjectName(QString::fromUtf8("statusbar")); + ClientClass->setStatusBar(statusbar); + + menubar->addAction(menu_File->menuAction()); + menubar->addAction(menu_View->menuAction()); + menu_View->addAction(actionXPlot); + menu_File->addAction(action_Exit); + + retranslateUi(ClientClass); + + bandBox->setCurrentIndex(1); + + + QMetaObject::connectSlotsByName(ClientClass); + } // setupUi + + void retranslateUi(QMainWindow *ClientClass) + { + ClientClass->setWindowTitle(QApplication::translate("ClientClass", "Xarcos Client", 0, QApplication::UnicodeUTF8)); + action_Exit->setText(QApplication::translate("ClientClass", "E&xit", 0, QApplication::UnicodeUTF8)); + actionXPlot->setText(QApplication::translate("ClientClass", "X&Plot", 0, QApplication::UnicodeUTF8)); + groupBoxSetting->setTitle(QApplication::translate("ClientClass", "Setting", 0, QApplication::UnicodeUTF8)); + label->setText(QApplication::translate("ClientClass", "\n" +"\n" +"

Central frequency (MHz)

", 0, QApplication::UnicodeUTF8)); + label_2->setText(QApplication::translate("ClientClass", "\n" +"\n" +"

Gain

", 0, QApplication::UnicodeUTF8)); + label_3->setText(QApplication::translate("ClientClass", "\n" +"\n" +"

ChIn

", 0, QApplication::UnicodeUTF8)); + label_6->setText(QApplication::translate("ClientClass", "Band", 0, QApplication::UnicodeUTF8)); + bandBox->clear(); + bandBox->insertItems(0, QStringList() + << QApplication::translate("ClientClass", "125.", 0, QApplication::UnicodeUTF8) + << QApplication::translate("ClientClass", "62.5", 0, QApplication::UnicodeUTF8) + << QApplication::translate("ClientClass", "31.2", 0, QApplication::UnicodeUTF8) + << QApplication::translate("ClientClass", "15.6", 0, QApplication::UnicodeUTF8) + << QApplication::translate("ClientClass", "7.81", 0, QApplication::UnicodeUTF8) + << QApplication::translate("ClientClass", "3.91", 0, QApplication::UnicodeUTF8) + << QApplication::translate("ClientClass", "1.95", 0, QApplication::UnicodeUTF8) + << QApplication::translate("ClientClass", ".976", 0, QApplication::UnicodeUTF8) + << QApplication::translate("ClientClass", ".488", 0, QApplication::UnicodeUTF8) + << QApplication::translate("ClientClass", "0", 0, QApplication::UnicodeUTF8) + ); + ModoPol->setText(QApplication::translate("ClientClass", " Polarimetric Mode", 0, QApplication::UnicodeUTF8)); + label_7->setText(QApplication::translate("ClientClass", "N Section", 0, QApplication::UnicodeUTF8)); + pushButtonPrec->setText(QApplication::translate("ClientClass", "<<", 0, QApplication::UnicodeUTF8)); + pushButtonSucc->setText(QApplication::translate("ClientClass", ">>", 0, QApplication::UnicodeUTF8)); + pushButtonBroad->setText(QApplication::translate("ClientClass", "Broadcast", 0, QApplication::UnicodeUTF8)); + label_9->setText(QApplication::translate("ClientClass", "Int.time [min]", 0, QApplication::UnicodeUTF8)); + label_10->setText(QApplication::translate("ClientClass", "Repeat", 0, QApplication::UnicodeUTF8)); + Modo8Bit->setText(QApplication::translate("ClientClass", "Quantization 8 Bit", 0, QApplication::UnicodeUTF8)); + groupBoxStatus->setTitle(QApplication::translate("ClientClass", "Status", 0, QApplication::UnicodeUTF8)); + pushButtonInt->setText(QApplication::translate("ClientClass", "Integration", 0, QApplication::UnicodeUTF8)); + pushButtonAbort->setText(QApplication::translate("ClientClass", "Abort", 0, QApplication::UnicodeUTF8)); + pushButtonStart->setText(QApplication::translate("ClientClass", "Start", 0, QApplication::UnicodeUTF8)); + menu_View->setTitle(QApplication::translate("ClientClass", "&View", 0, QApplication::UnicodeUTF8)); + menu_File->setTitle(QApplication::translate("ClientClass", "&File", 0, QApplication::UnicodeUTF8)); + } // retranslateUi + +}; + +namespace Ui { + class ClientClass: public Ui_ClientClass {}; +} // namespace Ui + +#endif // XCLIENTGUI_H diff --git a/Common/Clients/XBackendClient/include/xclientGUIui.h b/Common/Clients/XBackendClient/include/xclientGUIui.h new file mode 100644 index 000000000..5387953a7 --- /dev/null +++ b/Common/Clients/XBackendClient/include/xclientGUIui.h @@ -0,0 +1,103 @@ +#ifndef XCLIENTGUIUI_H_ +#define XCLIENTGUIUI_H_ +#include +#include "xclientGUI.h" +#include + +#include "headResult.h" +#include "Specifiche.h" +#include "DataIntegrazione.h" +#include "xplot.h" +// ACS includes +#include +#include +#include +#include +#include +#include +#include +#include +#include "XControlSystem.h" +#include "Led.h" + +class xclientGUIui: public QMainWindow +{ + Q_OBJECT +public: + xclientGUIui(QWidget *parent = 0); + ~xclientGUIui(); +public: + XControlSystem XThread; + int N; + Specifiche spec;/*!< Specifiche object */ + vector RisultatiIntegrazione;/*!< vector of DataIntegrazione */ + Xplot *p; + int Open(); + Backends::XBackends_var sender; + Management::FitsWriter_var recv; + maci::SimpleClient* sc; + void setParameters(maci::SimpleClient* theClient,Backends::XBackends_var theSender,Management::FitsWriter_var theRecv); + bool INT; + QString QCatchAllError; + +public slots: + void Rivisualizza(int N); + void FileExit(); + void OpenXplot(); + bool OpenFile(char path[],char name[]); + void Check(); + void Integra(); + void StartInt(); + void AbortInt(); + void Broadcast(); + void Modifica(); + void Successivo_activated(); + void Precedente_activated(); + void UpdateStatus(char status); + void changeGUICatchAllErrorCode(); + +signals: + int setGUICatchAllErrorCode(); + +protected: + char *server; + int port; + +private: + void initAttributes() ; + void visualizza(int n); + void Salva(int n); + void SetReadOnly(bool modo); + + Led *ledHW, *ledData, *ledSetting,*ledActive,*ledAbort,*ledOverflowData, *ledBusy; + Ui_ClientClass ui; + +}; + +#define _CATCH_ALL(ROUTINE) \ + catch (ComponentErrors::ComponentErrorsEx &E) { \ + _ADD_BACKTRACE(ClientErrors::CouldntPerformActionExImpl,impl,E,ROUTINE); \ + IRA::CString CMessage; \ + _EXCPT_TO_CSTRING(CMessage,impl); \ + impl.log(); \ + QCatchAllError = QString("%1").arg((const char*)CMessage); \ + } \ + catch (CORBA::SystemException &C) { \ + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,ROUTINE); \ + impl.setName(C._name()); \ + impl.setMinor(C.minor()); \ + IRA::CString CMessage; \ + _EXCPT_TO_CSTRING(CMessage,impl); \ + impl.log(); \ + QCatchAllError = QString("%1").arg((const char*)CMessage); \ + } \ + catch (...) { \ + _EXCPT(ClientErrors::UnknownExImpl,impl,ROUTINE); \ + IRA::CString CMessage; \ + _EXCPT_TO_CSTRING(CMessage,impl); \ + impl.log(); \ + QCatchAllError = QString("%1").arg((const char*)CMessage); \ + } \ + emit setGUICatchAllErrorCode(); + +#endif /*XCLIENTGUIUI_H_*/ diff --git a/Common/Clients/XBackendClient/include/xplot.h b/Common/Clients/XBackendClient/include/xplot.h new file mode 100644 index 000000000..e5841bd1b --- /dev/null +++ b/Common/Clients/XBackendClient/include/xplot.h @@ -0,0 +1,159 @@ +#ifndef XPLOT_H +#define XPLOT_H + +/** + * + * Osservatorio Astrofisico di Arcetri + * + * This code is under GNU General Public Licence (GPL). + * + * Who when What + * Liliana Branciforti(bliliana@arcetri.astro.it) 02/04/2009 Creation + */ + +#include +#include "xplotGUI.h" +#include +#include +#include +#include +#include +#include +#include "DataIntegrazione.h" +#include "plot.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class QwtPlotZoomer; +class QwtPlotPicker; +class QwtPlotPanner; + +/** + * The Xplot class administrate a windows. + * This windows show the results of integration each section. + * It provides display of curves of results in region plotting. + * It also provides a cursor position and implement zooming in plot region. + * + * Using the Xplot class + * 1.Create the xplot.ui that contain + * ui.pushButtonPrec + * ui.pushButtonSucc + * ui.pushButtonZoom + * ui.mywidget + * ecc... + * 2.Make sure that you include Xplot.h + */ +class Xplot: public QWidget +{ + Q_OBJECT +public: + int N;/*!< is the current section show */ + int Sezioni,MaxSezioni;/*!< is the MaxSection can to be display */ + vector *dato;/*! results to show */ + QwtDoubleRect Base,Rect;/*!< QwtDoubleRect object */ + bool ZOOM;/*!< is the state of zooming */ + + /** + * Constructor. + * @param parent is the reference at the QMainWindow + * @param sez is the MaxSection that can to be display + * @param dati is a pointer vector results to show + */ + Xplot(QWidget *parent=0,int sez=8, vector *dati=0); + + /** + * Destructor. + */ + ~Xplot(); + +public slots: + + /** + * The Successivo_activated slots method attempts to display following section. + */ + void Successivo_activated(); + + /** + * The Precedente_activated slots method attempts to display previous section. + */ + void Precedente_activated(); + + /** + * The Visual slots method attempts to display the section tmp. + * @param tmp is the number of section to display. + */ + void Visual(int tmp); + + /** + * The initPlot slots method attempts to initialize the plot region. + */ + void initPlot(); + + /** + * The plotDataZero slots method attempts to display the plot region empty. + */ + void plotDataZero(); + + /** + * The plotData slots method attempts to display the result in plot region. + */ + void plotData(DataIntegrazione *tp); + + /** + * The enableZoom slots method attempts to activate or deactivate zoom. + */ + void enableZoom(); + +private slots: + /** + * The moved slots method attempts to move the cursor. + * @param QPoint is the position of cursor + */ + void moved(const QPoint &pos); + + /** + * The selected slots method attempts to selecte the zoom region. + * @param QwtPolygon + */ + void selected(const QwtPolygon &pol); + + /** + * The enableZoom method attempts set the zoom. + * @param on is state the zoom to set. + */ + void enableZoomMode(bool on); + +private: + /** + * The visualizza method attempts to display the section n. + * @param n is the number of section to display. + */ + void visualizza(int n); + /** + * The showInfo method attempts visual the information position on the plot region. + * @param on is state the zoom to set. + */ + void showInfo(QString text = QString::null); + + Ui::XplotGUIClass ui;/*!< Ui::XplotGUIClass create by Qt moc */ + Plot *d_plot;/*!< The pointer to Plot in the Xplot object */ + QwtPlotZoomer *d_zoomer;/*!< The pointer to QwtPlotZoomer in the Xplot object */ + QwtPlotPicker *d_picker;/*!< The pointer to QwtPlotPicker in the Xplot object */ + QwtPlotPanner *d_panner;/*!< The pointer to QwtPlotPanner in the Xplot object */ +}; + +#endif // XPLOT_H diff --git a/Common/Clients/XBackendClient/include/xplotGUI.h b/Common/Clients/XBackendClient/include/xplotGUI.h new file mode 100644 index 000000000..391206bb9 --- /dev/null +++ b/Common/Clients/XBackendClient/include/xplotGUI.h @@ -0,0 +1,213 @@ +/******************************************************************************** +** Form generated from reading ui file 'xplotGUI.ui' +** +** Created: Fri May 21 18:12:31 2010 +** by: Qt User Interface Compiler version 4.3.4 +** +** WARNING! All changes made in this file will be lost when recompiling ui file! +********************************************************************************/ + +#ifndef XPLOTGUI_H +#define XPLOTGUI_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Ui_XplotGUIClass +{ +public: + QGridLayout *gridLayout; + QVBoxLayout *vboxLayout; + QHBoxLayout *hboxLayout; + QGroupBox *groupBox; + QGridLayout *gridLayout1; + QWidget *mywidget; + QGroupBox *groupBox_2; + QGridLayout *gridLayout2; + QVBoxLayout *vboxLayout1; + QGridLayout *gridLayout3; + QLabel *label; + QLineEdit *Xx; + QLabel *label_2; + QLineEdit *Yy; + QCheckBox *checkOverFlow; + QHBoxLayout *hboxLayout1; + QLabel *label_8; + QLineEdit *SezioneCorrente; + QToolButton *pushButtonPrec; + QToolButton *pushButtonSucc; + QSpacerItem *spacerItem; + QPushButton *pushButtonZoom; + + void setupUi(QWidget *XplotGUIClass) + { + if (XplotGUIClass->objectName().isEmpty()) + XplotGUIClass->setObjectName(QString::fromUtf8("XplotGUIClass")); + XplotGUIClass->resize(738, 360); + gridLayout = new QGridLayout(XplotGUIClass); + gridLayout->setSpacing(6); + gridLayout->setMargin(11); + gridLayout->setObjectName(QString::fromUtf8("gridLayout")); + vboxLayout = new QVBoxLayout(); + vboxLayout->setSpacing(6); + vboxLayout->setMargin(11); + vboxLayout->setObjectName(QString::fromUtf8("vboxLayout")); + hboxLayout = new QHBoxLayout(); + hboxLayout->setSpacing(6); + hboxLayout->setMargin(11); + hboxLayout->setObjectName(QString::fromUtf8("hboxLayout")); + groupBox = new QGroupBox(XplotGUIClass); + groupBox->setObjectName(QString::fromUtf8("groupBox")); + gridLayout1 = new QGridLayout(groupBox); + gridLayout1->setSpacing(6); + gridLayout1->setMargin(11); + gridLayout1->setObjectName(QString::fromUtf8("gridLayout1")); + mywidget = new QWidget(groupBox); + mywidget->setObjectName(QString::fromUtf8("mywidget")); + + gridLayout1->addWidget(mywidget, 0, 0, 1, 1); + + + hboxLayout->addWidget(groupBox); + + groupBox_2 = new QGroupBox(XplotGUIClass); + groupBox_2->setObjectName(QString::fromUtf8("groupBox_2")); + groupBox_2->setMinimumSize(QSize(165, 0)); + groupBox_2->setMaximumSize(QSize(130, 16777215)); + gridLayout2 = new QGridLayout(groupBox_2); + gridLayout2->setSpacing(6); + gridLayout2->setMargin(11); + gridLayout2->setObjectName(QString::fromUtf8("gridLayout2")); + vboxLayout1 = new QVBoxLayout(); + vboxLayout1->setSpacing(6); + vboxLayout1->setMargin(11); + vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1")); + gridLayout3 = new QGridLayout(); + gridLayout3->setSpacing(6); + gridLayout3->setMargin(11); + gridLayout3->setObjectName(QString::fromUtf8("gridLayout3")); + label = new QLabel(groupBox_2); + label->setObjectName(QString::fromUtf8("label")); + + gridLayout3->addWidget(label, 0, 0, 1, 1); + + Xx = new QLineEdit(groupBox_2); + Xx->setObjectName(QString::fromUtf8("Xx")); + Xx->setMinimumSize(QSize(66, 0)); + Xx->setMaximumSize(QSize(100, 16777215)); + Xx->setReadOnly(true); + + gridLayout3->addWidget(Xx, 0, 1, 1, 1); + + label_2 = new QLabel(groupBox_2); + label_2->setObjectName(QString::fromUtf8("label_2")); + + gridLayout3->addWidget(label_2, 1, 0, 1, 1); + + Yy = new QLineEdit(groupBox_2); + Yy->setObjectName(QString::fromUtf8("Yy")); + Yy->setMinimumSize(QSize(66, 0)); + Yy->setMaximumSize(QSize(100, 16777215)); + Yy->setReadOnly(true); + + gridLayout3->addWidget(Yy, 1, 1, 1, 1); + + + vboxLayout1->addLayout(gridLayout3); + + checkOverFlow = new QCheckBox(groupBox_2); + checkOverFlow->setObjectName(QString::fromUtf8("checkOverFlow")); + + vboxLayout1->addWidget(checkOverFlow); + + + gridLayout2->addLayout(vboxLayout1, 0, 0, 1, 1); + + + hboxLayout->addWidget(groupBox_2); + + + vboxLayout->addLayout(hboxLayout); + + hboxLayout1 = new QHBoxLayout(); + hboxLayout1->setSpacing(6); + hboxLayout1->setMargin(11); + hboxLayout1->setObjectName(QString::fromUtf8("hboxLayout1")); + label_8 = new QLabel(XplotGUIClass); + label_8->setObjectName(QString::fromUtf8("label_8")); + + hboxLayout1->addWidget(label_8); + + SezioneCorrente = new QLineEdit(XplotGUIClass); + SezioneCorrente->setObjectName(QString::fromUtf8("SezioneCorrente")); + SezioneCorrente->setMaximumSize(QSize(31, 16777215)); + SezioneCorrente->setReadOnly(true); + + hboxLayout1->addWidget(SezioneCorrente); + + pushButtonPrec = new QToolButton(XplotGUIClass); + pushButtonPrec->setObjectName(QString::fromUtf8("pushButtonPrec")); + + hboxLayout1->addWidget(pushButtonPrec); + + pushButtonSucc = new QToolButton(XplotGUIClass); + pushButtonSucc->setObjectName(QString::fromUtf8("pushButtonSucc")); + + hboxLayout1->addWidget(pushButtonSucc); + + spacerItem = new QSpacerItem(428, 17, QSizePolicy::Expanding, QSizePolicy::Minimum); + + hboxLayout1->addItem(spacerItem); + + pushButtonZoom = new QPushButton(XplotGUIClass); + pushButtonZoom->setObjectName(QString::fromUtf8("pushButtonZoom")); + + hboxLayout1->addWidget(pushButtonZoom); + + + vboxLayout->addLayout(hboxLayout1); + + + gridLayout->addLayout(vboxLayout, 0, 0, 1, 1); + + + retranslateUi(XplotGUIClass); + + QMetaObject::connectSlotsByName(XplotGUIClass); + } // setupUi + + void retranslateUi(QWidget *XplotGUIClass) + { + XplotGUIClass->setWindowTitle(QApplication::translate("XplotGUIClass", "Xarcos Plot", 0, QApplication::UnicodeUTF8)); + groupBox->setTitle(QApplication::translate("XplotGUIClass", "Plot region", 0, QApplication::UnicodeUTF8)); + groupBox_2->setTitle(QApplication::translate("XplotGUIClass", "Measure Tp", 0, QApplication::UnicodeUTF8)); + label->setText(QApplication::translate("XplotGUIClass", "Xx", 0, QApplication::UnicodeUTF8)); + label_2->setText(QApplication::translate("XplotGUIClass", "Yy", 0, QApplication::UnicodeUTF8)); + checkOverFlow->setText(QApplication::translate("XplotGUIClass", "Overflow", 0, QApplication::UnicodeUTF8)); + label_8->setText(QApplication::translate("XplotGUIClass", "N Section", 0, QApplication::UnicodeUTF8)); + pushButtonPrec->setText(QApplication::translate("XplotGUIClass", "<<", 0, QApplication::UnicodeUTF8)); + pushButtonSucc->setText(QApplication::translate("XplotGUIClass", ">>", 0, QApplication::UnicodeUTF8)); + pushButtonZoom->setText(QApplication::translate("XplotGUIClass", "Zoom", 0, QApplication::UnicodeUTF8)); + Q_UNUSED(XplotGUIClass); + } // retranslateUi + +}; + +namespace Ui { + class XplotGUIClass: public Ui_XplotGUIClass {}; +} // namespace Ui + +#endif // XPLOTGUI_H diff --git a/Common/Clients/XBackendClient/src/.idl-compilation-end b/Common/Clients/XBackendClient/src/.idl-compilation-end new file mode 100644 index 000000000..e69de29bb diff --git a/Common/Clients/XBackendClient/src/.idl-compilation-start b/Common/Clients/XBackendClient/src/.idl-compilation-start new file mode 100644 index 000000000..e69de29bb diff --git a/Common/Clients/XBackendClient/src/Data.cpp b/Common/Clients/XBackendClient/src/Data.cpp new file mode 100644 index 000000000..5fc515daa --- /dev/null +++ b/Common/Clients/XBackendClient/src/Data.cpp @@ -0,0 +1,24 @@ +#include "Data.h" + +// Constructors/Destructors +// + +Data::Data ( ) { + SetZeroData(); + initAttributes(); +} + +Data::~Data ( ) { } + +void Data::initAttributes ( ) { + +} + +void Data::SetZeroData ( ) { + intestazioneCh1.SetZeroHeadResult(); + intestazioneCh2.SetZeroHeadResult(); + buffer=NULL; + sizeBuff=0; + Overflow=false; +} + diff --git a/Common/Clients/XBackendClient/src/DataIntegrazione.cpp b/Common/Clients/XBackendClient/src/DataIntegrazione.cpp new file mode 100644 index 000000000..12b597f95 --- /dev/null +++ b/Common/Clients/XBackendClient/src/DataIntegrazione.cpp @@ -0,0 +1,121 @@ +#include "DataIntegrazione.h" +const int Max=4096; + +DataIntegrazione::DataIntegrazione ( ) { + SetZeroDataIntegratione ( ); + initAttributes(); + +} + +DataIntegrazione::~DataIntegrazione ( ) { } + +void DataIntegrazione::SetTpZero ( ) { + + tp.resize(2); + for(int i=0;i<2;i++) tp[i]=0; + } + +void DataIntegrazione::SetXxZero ( ) { + + xx.resize(lungArrayDati); + for(int i=0;i zero;//è gia inizializzato a zero + + xy.resize(lungArrayDati); + for(int i=0;i comp; + double a=0,b=0; + int c=0; + + c=xy.capacity(); + if(c(a,b); + xy[c]+=comp; + comp=xy[c]; + } + +} + +void DataIntegrazione::initAttributes ( ) {//DA MODIFICARE****************** + head.SetZeroHeadResult(); + tempoIntegrazione=0; + modo8Bit=true; + utInizio.dstflag=0; + utInizio.millitm=0; + utInizio.timezone=0; + utInizio.time=0; +// utInizio.timeb=0; + utFine=utInizio; + ValoriValidi=false; + nArrayDati=0; + lungArrayDati=0; + Overflow=false; + //Gestione Array da Implementare*************************************** +} + +void DataIntegrazione::SetZeroDataIntegratione ( ) { + + head.SetZeroHeadResult(); + tempoIntegrazione=0; + modo8Bit=true; + utInizio.dstflag=0; + utInizio.millitm=0; + utInizio.timezone=0; + utInizio.time=0; +// utInizio.timeb=0; + utFine=utInizio; + ValoriValidi=false; + nArrayDati=0; + lungArrayDati=0; + Overflow=false; + //Gestione Array da Implementare*************************************** +} + diff --git a/Common/Clients/XBackendClient/src/Led.cpp b/Common/Clients/XBackendClient/src/Led.cpp new file mode 100644 index 000000000..c287f5f18 --- /dev/null +++ b/Common/Clients/XBackendClient/src/Led.cpp @@ -0,0 +1,69 @@ +#include "Led.h" + +Led::Led(QWidget * parent,QString str ,color attrt, mode modt) +{ + + attr=attrt; + mod=modt; + lab=new QLabel(parent); + labT=new QLabel(parent); + if(attr==Green) { + if(mod==On) icon=new QIcon("../icon/greenOn.png"); + else icon=new QIcon("../icon/greenOff.png"); + } + if(attr==Red) { + if(mod==On)icon=new QIcon("../icon/redOn.png"); + else icon=new QIcon("../icon/redOff.png"); + } + if(attr==Yellow) { + if(mod==On)icon=new QIcon("../icon/yellowOn.png"); + else icon=new QIcon("../icon/yellowOff.png"); + } + QPixmap pixmap = icon->pixmap(QSize(18, 18),QIcon::Normal, QIcon::On); + lab->setPixmap(pixmap); + text=str; + text.insert(0," "); + labT->setText(text); +} + +Led::~Led() +{ +} + +void Led::setMode(mode modt){ + + mod=modt; + if(attr==Green){ + if(mod==On)icon=new QIcon("../icon/greenOn.png"); + else icon=new QIcon("../icon/greenOff.png"); + } + if(attr==Red) { + if(mod==On)icon=new QIcon("../icon/redOn.png"); + else icon=new QIcon("../icon/redOff.png"); + } + if(attr==Yellow) { + if(mod==On)icon=new QIcon("../icon/yellowOn.png"); + else icon=new QIcon("../icon/yellowOff.png"); + } + QPixmap pixmap = icon->pixmap(QSize(18, 18),QIcon::Normal, QIcon::On); + lab->setPixmap(pixmap); +} + +void Led::setColor(color attrt){ + + attr=attrt; + if(attr==Green) { + if(mod==On)icon=new QIcon("../icon/greenOn.png"); + else icon=new QIcon("../icon/greenOff.png"); + } + if(attr==Red){ + if(mod==On)icon=new QIcon("../icon/redOn.png"); + else icon=new QIcon("../icon/redOff.png"); + } + if(attr==Yellow) { + if(mod==On)icon=new QIcon("../icon/yellowOn.png"); + else icon=new QIcon("../icon/yellowOff.png"); + } + QPixmap pixmap = icon->pixmap(QSize(18, 18),QIcon::Normal, QIcon::On); + lab->setPixmap(pixmap); +} \ No newline at end of file diff --git a/Common/Clients/XBackendClient/src/Makefile b/Common/Clients/XBackendClient/src/Makefile new file mode 100644 index 000000000..d9a2143f6 --- /dev/null +++ b/Common/Clients/XBackendClient/src/Makefile @@ -0,0 +1,349 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.6 2010/03/04 14:51:17 bliliana Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# Manager 23/07/09 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ +#QTDIR=/usr/local/Trolltech/Qt-4.5.2 +#QTLIB=/usr/local/Trolltech/Qt-4.5.2/lib +QWTDIR = /usr/local/qwt-5.1.2-svn +# +# user definable C-compilation flags +#USER_CFLAGS = +USER_CFLAGS = -DQT_THREAD_SUPPORT + +# +# additional include and library search paths +USER_INC = -I$(QTDIR)/include \ + -I$(QTDIR)/include/Qt \ + -I$(QTDIR)/include/QtCore \ + -I$(QTDIR)/include/QtGui \ + -I$(QWTDIR)/include +USER_LIB = -lACE \ + -lTAO \ + -lTAO_DsLogAdmin \ + -lTAO_CosNaming \ + -lTAO_IORTable \ + -lTAO_PortableServer \ + -lTAO_Svc_Utils \ + -lTAO_CosTrading \ + -lTAO_CosNotification \ + -lTAO_DynamicAny \ + -lTAO_IFR_Client \ + -lTAO_CosProperty \ + -lacsutil \ + -lcdb \ + -llogging \ + -lacscomponent \ + -lmaciClient \ + -lmaci \ + -lacserr \ + -lm \ + -lloki \ + -lbaci \ + -lacsnc \ + -L$(QTLIB) \ + -lQt3Support \ + -lQtAssistantClient \ + -lQtCore \ + -lQtDBus \ + -lQtDesignerComponents \ + -lQtDesigner \ + -lQtGui \ + -lQtNetwork \ + -lQtOpenGL \ + -lQtSql \ + -lQtSvg \ + -lQtTest \ + -lQtXml \ + -L$(QWTDIR)/lib \ + -lqwt + +# +# Qt GUI files +# ------------ +# +# ATTENTION: +# ---------- +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# When using Qt, then uncomment +# the Qt lines above in USER_LIB = ... +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# +# Do not forget to add ../include/ if +# the files live there! +# +# Add .ui files here: +QT_UI_FILES = xclientGUI xplotGUI + +# +# Add class declaration files (.h) +# which use the Q_OBJECT macro here: +QT_MOC_FILES_H =xclientGUIui xplot XControlSystem +# +# Add class implementation files (.cpp) +# which use the Q_OBJECT macro here: +QT_MOC_FILES_CPP = +# +# Definitions for "easier" generation of needed Qt files. +# Extremly ugly!!! But it works. :) +# ------------------------------------------ +# PLEASE DO NOT TOUCH... +# ------------------------------------------ +# Correct filenames: foo --> foo.ui +QT_UI_FILES_UI = $(addsuffix .ui,$(QT_UI_FILES)) +# foo --> ../include/foo.h +QT_UI_FILES_H = $(addprefix ../include/,$(addsuffix .h,$(QT_UI_FILES))) +# foo --> foo.cpp +#QT_UI_FILES_CPP = $(addsuffix .cpp,$(QT_UI_FILES)) +QT_UI_FILES_CPP = + +# Build 'moc'ed filename target: foo --> moc_foo.cpp +#QT_UI_FILES_MOC = $(addprefix moc_,$(addsuffix .cpp,$(QT_UI_FILES))) + +# Build correct filenames for 'moc'ed files: foo --> ../include/foo.h +QT_UI_FILES_EXTERN_H = $(addprefix ../include/,$(addsuffix .h,$(QT_MOC_FILES_H))) +# foo --> foo.cpp +QT_UI_FILES_EXTERN_CPP = $(addsuffix .cpp,$(QT_MOC_FILES_CPP)) + +# Add moc_ and .cpp to 'moc'ed file targets: foo --> moc_foo.cpp +QT_UI_FILES_EXTERN_MOC_H = $(addprefix moc_,$(addsuffix .cpp,$(QT_MOC_FILES_H))) +# foo --> moc_foo.cpp +QT_UI_FILES_EXTERN_MOC_CPP = $(addprefix moc_,$(addsuffix .cpp,$(QT_MOC_FILES_CPP))) + +# Build list of files to be compiled: foo.cpp --> foo +QT_COMPILE_FILES = $(subst .cpp,,$(QT_UI_FILES_MOC) $(QT_UI_FILES_EXTERN_MOC_H) $(QT_UI_FILES_EXTERN_MOC_CPP)) +# ------------------------------------------ +# PLEASE DO NOT TOUCH UNTIL HERE! +# ------------------------------------------ +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = XBackendsClient +EXECUTABLES_L = + +# +# +XBackendsClient_OBJECTS = $(QT_COMPILE_FILES) XBackendsClient xclientGUIui xplot plot Led\ + Specifiche headResult DataIntegrazione Data XControlSystem + xxxxx_LDFLAGS = +XBackendsClient_LIBS = XBackendsStubs IRALibrary FitsWriterStubs GenericBackendStubs ComponentErrors ClientErrors \ + ManagementErrors ManagmentDefinitionsStubs bulkDataStubs bulkDataSenderStubs ReceiversDefinitionsStubs BackendsDefinitionsStubs\ + bulkDataReceiverStubs ACSBulkDataError ComponentErrors BackendsErrors ParserErrors + +$(PROG)_OBJECTS = $(PROG) +$(PROG)_LDFLAGS = +$(PROG)_LIBS = C++ + +# +# special compilation flags for single c sources +#yyyyy_CFLAGS = + +# +# Includes (.h) files (public only) +# --------------------------------- +INCLUDES = + +# +# Libraries (public and local) +# ---------------------------- +LIBRARIES = +LIBRARIES_L = + +# +# +lllll_OBJECTS = + +# +# Scripts (public and local) +# ---------------------------- +SCRIPTS = +SCRIPTS_L = + +# +# TCL scripts (public and local) +# ------------------------------ +TCL_SCRIPTS = +TCL_SCRIPTS_L = + +# +# Python stuff (public and local) +# ---------------------------- +PY_SCRIPTS = +PY_SCRIPTS_L = + +PY_MODULES = +PY_MODULES_L = + +PY_PACKAGES = +PY_PACKAGES_L = +pppppp_MODULES = + +# +# +tttttt_OBJECTS = +tttttt_TCLSH = +tttttt_LIBS = + +# +# TCL libraries (public and local) +# ------------------------------ +TCL_LIBRARIES = +TCL_LIBRARIES_L = + +# +# +tttlll_OBJECTS = + +# +# Configuration Database Files +# ---------------------------- +CDB_SCHEMAS = + +# +# IDL Files and flags +# +IDL_FILES = +TAO_IDLFLAGS = +USER_IDL = +# +# Jarfiles and their directories +# +JARFILES= +jjj_DIRS= +jjj_EXTRAS= +# +# java sources in Jarfile on/off +DEBUG= +# +# ACS XmlIdl generation on/off +# +XML_IDL= +# +# Java Component Helper Classes generation on/off +# +COMPONENT_HELPERS= +# +# Java Entity Classes generation on/off +# +XSDBIND= +# +# Schema Config files for the above +# +XSDBIND_INCLUDE= +# man pages to be done +# -------------------- +MANSECTIONS = +MAN1 = +MAN3 = +MAN5 = +MAN7 = +MAN8 = + +# +# local man pages +# --------------- +MANl = + +# +# ASCII file to be converted into Framemaker-MIF +# -------------------- +ASCII_TO_MIF = + +# +# other files to be installed +#---------------------------- +INSTALL_FILES = + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- +ifdef ACSROOT + MAKEDIR = $(shell if [ -f $(INTROOT)/include/acsMakefile ]; then \ + echo $(INTROOT)/include; \ + else \ + echo $(ACSROOT)/include; \ + fi;) + include $(MAKEDIR)/acsMakefile +else + MAKEDIR = $(shell if [ -f $(INTROOT)/include/vltMakefile ]; then \ + echo $(INTROOT)/include; \ + else \ + echo $(VLTROOT)/include; \ + fi;) + include $(MAKEDIR)/vltMakefile +endif + +# +# TARGETS +# ------- +$(QT_UI_FILES_H): ../include/%.h: %.ui $(QT_UI_FILES_UI) + $(QTDIR)/bin/uic -o $@ $< + +#$(QT_UI_FILES_CPP): %.cpp: ../include/%.h $(QT_UI_FILES_UI) +# $(QTDIR)/bin/uic -o $@ $< $(subst .cpp,.ui,$@) +# +#$(QT_UI_FILES_MOC): moc_%.cpp: ../include/XClient.h +# $(QTDIR)/bin/moc -o $@ $< + +$(QT_UI_FILES_EXTERN_MOC_H): moc_%.cpp: ../include/%.h $(QT_UI_FILES_EXTERN_H) + $(QTDIR)/bin/moc -o $@ $< + +$(QT_UI_FILES_EXTERN_MOC_CPP): moc_%.cpp: %.cpp $(QT_UI_FILES_EXTERN_CPP) + $(QTDIR)/bin/moc -o $@ $< + +#qt: $(QT_UI_FILES_H) $(QT_UI_FILES_CPP) $(QT_UI_FILES_MOC) $(QT_UI_FILES_EXTERN_MOC_H) $(QT_UI_FILES_EXTERN_MOC_CPP) +qt: $(QT_UI_FILES_H) $(QT_UI_FILES_MOC) $(QT_UI_FILES_EXTERN_MOC_H) $(QT_UI_FILES_EXTERN_MOC_CPP) + @echo " . . . 'qt' done" + +qt_clean: +# @rm -f $(QT_UI_FILES_H) $(QT_UI_FILES_CPP) $(QT_UI_FILES_MOC) $(QT_UI_FILES_EXTERN_MOC_H) $(QT_UI_FILES_EXTERN_MOC_CPP) + @rm -f $(QT_UI_FILES_H) $(QT_UI_FILES_MOC) $(QT_UI_FILES_EXTERN_MOC_H) $(QT_UI_FILES_EXTERN_MOC_CPP) + @echo " . . . 'qt_clean' done" + +all: qt do_all + @echo " . . . 'all' done" + +clean : qt_clean clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Clients/XBackendClient/src/Specifiche.cpp b/Common/Clients/XBackendClient/src/Specifiche.cpp new file mode 100644 index 000000000..0249ae256 --- /dev/null +++ b/Common/Clients/XBackendClient/src/Specifiche.cpp @@ -0,0 +1,50 @@ +#include "Specifiche.h" + +// Constructors/Destructors +// + +Specifiche::Specifiche ( ) { +initAttributes(); +} + +Specifiche::~Specifiche ( ) { } + +void Specifiche::initAttributes ( ) { + int i=0; + HeadResult temp; + + tempoEle=10; + FunctionAdc=1;//deve essere 0 + nCicli=0; + tempoIntegrazione=5*60; + modo8bit=true; + maxSezioni=16; + nSezioni=1; + //temp.SetZeroHeadResult();//Sono tutti non usati + //specificaSezione.reserve(nSezioni); + specificaSezione.reserve(maxSezioni); + for(i=0;i +#include "XBackendsC.h" +#include +#include +#include +#include + + +#define MAX_GAIN 256 + +#define _GET_ACS_PROPERTY(TYPE,NAME) TYPE##_var NAME; \ +{ \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_INFO,"Trying to get property "#NAME"...")); \ + NAME=sender->NAME(); \ + if (NAME.ptr()!=TYPE::_nil()) { \ + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %x",NAME.ptr())); \ + } \ + else { \ + _EXCPT(ClientErrors::CouldntAccessPropertyExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setPropertyName(#NAME); \ + impl.log(); \ + goto ErrorLabel; \ + } \ +} + +#define _INSTALL_MONITOR(COMP,TRIGGERTIME) { \ + if (!COMP->installAutomaticMonitor(GUARDINTERVAL)) { \ + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,MODULE_NAME"::Main()"); \ + impl.setAction("Install monitor"); \ + impl.setReason((const char*)COMP->getLastError()); \ + impl.log(); \ + ACE_OS::sleep(1); \ + goto ErrorLabel; \ + } \ + COMP->setTriggerTime(TRIGGERTIME); \ +} + + +#define _GET_PROPERTY_VALUE_ONCE(VAL,PROPERTY,PROPERTNAME) { \ + try { \ + ACSErr::Completion_var cmpl; \ + VAL=PROPERTY->get_sync(cmpl.out()); \ + CompletionImpl cmplImpl(cmpl.in()); \ + if (!(cmplImpl.isErrorFree())) { \ + _ADD_BACKTRACE(ClientErrors::CouldntAccessPropertyExImpl,impl,cmplImpl,"::Main()"); \ + impl.setPropertyName(PROPERTNAME); \ + impl.log(); \ + goto ErrorLabel; \ + } \ + } \ + catch (...) { \ + _EXCPT(ClientErrors::UnknownExImpl,impl,"::Main()"); \ + impl.log(); \ + goto ErrorLabel; \ + } \ +} + +// #define _CATCH_ALL(OUTPUT,ROUTINE,COMP_EXCEPTION) \ +// catch (COMP_EXCEPTION &E) { \ +// _ADD_BACKTRACE(ClientErrors::CouldntPerformActionExImpl,impl,E,ROUTINE); \ +// IRA::CString Message; \ +// if (OUTPUT!=NULL) { \ +// _EXCPT_TO_CSTRING(Message,impl); \ +// OUTPUT->setValue(Message); \ +// OUTPUT->Refresh(); \ +// } \ +// impl.log(); \ +// } \ +// catch (ComponentErrors::ComponentErrorsEx &E) { \ +// _ADD_BACKTRACE(ClientErrors::CouldntPerformActionExImpl,impl,E,ROUTINE); \ +// IRA::CString Message; \ +// if (OUTPUT!=NULL) { \ +// _EXCPT_TO_CSTRING(Message,impl); \ +// OUTPUT->setValue(Message); \ +// OUTPUT->Refresh(); \ +// } \ +// impl.log(); \ +// } \ +// catch (CORBA::SystemException &C) { \ +// _EXCPT(ClientErrors::CORBAProblemExImpl,impl,ROUTINE); \ +// impl.setName(C._name()); \ +// impl.setMinor(C.minor()); \ +// if (OUTPUT!=NULL) { \ +// IRA::CString Message; \ +// _EXCPT_TO_CSTRING(Message,impl); \ +// OUTPUT->setValue(Message); \ +// OUTPUT->Refresh(); \ +// } \ +// impl.log(); \ +// } \ +// catch (...) { \ +// _EXCPT(ClientErrors::UnknownExImpl,impl,ROUTINE); \ +// if (OUTPUT!=NULL) { \ +// IRA::CString Message; \ +// _EXCPT_TO_CSTRING(Message,impl); \ +// OUTPUT->setValue(Message); \ +// OUTPUT->Refresh(); \ +// } \ +// impl.log(); \ +// } + +#define COMPONENT_INTERFACE COMPONENT_IDL_MODULE::COMPONENT_IDL_INTERFACE +#define COMPONENT_DECLARATION COMPONENT_IDL_MODULE::COMPONENT_SMARTPOINTER + +#define MAX_NUM_INPUTS 18 + +#define TEMPLATE_4_ROTBOOLEAN Management::ROTBoolean_ptr,ACS::Monitorpattern,ACS::Monitorpattern_var,_TW_CBpattern,ACS::CBpattern_var + +ACE_RCSID(acsexmpl, acsexmpClient, "$Id: XBackendsClient.cpp,v 1.11 2010/05/24 12:19:53 bliliana Exp $") +using namespace maci; + + +IRA::CString polarizationFormat(const baci::BACIValue& value,const void* arg) +{ + if (value.longValue()<2) { + if (value.longValue()==0) { + return IRA::CString("LCP"); + } + else { + return IRA::CString("RCP"); + } + } + else if (value.longValue()==2){ + return IRA::CString("FULL_STOKES"); + } + return IRA::CString("FULL_STOKES"); +} + +double gainToAttenuation(double gain){ return -20*log10((double)gain/MAX_GAIN); } +double attenuationToGain(double attenuation){ return MAX_GAIN*exp10((double)-attenuation/20); } + +int main(int argc, char *argv[]) +{ + Backends::XBackends_var sender; + Management::FitsWriter_var recv; + bool Component = false; + QApplication a(argc, argv); + int i=0; + long integ=0,N=0,V=0; + CString str(""); + HeadResult tmp; + //xclientGUIui p; + xclientGUIui w; + //p.show(); + w.show(); + + /** + * Create the instance of Client and Init() it. + */ + SimpleClient* client=new SimpleClient; + bool loggedIn=false; + try + { + if(client->init(qApp->argc(),qApp->argv())==0) + { + _EXCPT(ClientErrors::CouldntInitExImpl,impl,"XBackendsClient::Main()"); + impl.log(); + delete client; + goto CloseLabel; + } + if(client->login()==0) + { + _EXCPT(ClientErrors::CouldntLoginExImpl,impl,"XBackendsClient::Main()"); + impl.log(); + delete client; + goto CloseLabel; + } + ACS_SHORT_LOG((LM_INFO, "client %s activated","XBackendsClient")); + loggedIn = true; + } + catch(...) + { + _EXCPT(ClientErrors::UnknownExImpl,impl,"XBackendsClient::Main()"); + impl.log(); + delete client; + goto CloseLabel; + } + + // Get reference to the Mount component + ACS_SHORT_LOG((LM_INFO, "getting component %s","Backends/XBackends")); + try + { + sender=client->getComponent("Backends/XBackends",0,true); + //sender = client->get_object ("Backends/XBackends", 0, true); + if (CORBA::is_nil(sender.in()) == true){ + _EXCPT(ClientErrors::CouldntAccessComponentExImpl,impl,"XBackendsClient::Main()"); + impl.setComponentName("Backends/XBackends"); + impl.log(); + goto CloseLabel; + } + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"XBackendsClient::Main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + goto CloseLabel; + } + catch(...) + { + _EXCPT(ClientErrors::UnknownExImpl,impl,"XBackendsClient::Main()"); + impl.log(); + goto CloseLabel; + } + Component = true; + ACS_SHORT_LOG((LM_INFO, "component %s activated","Backends/XBackends")); + ACS_LOG(LM_FULL_INFO,MODULE_NAME"::Main()",(LM_DEBUG,"OK, reference is: %d",sender.ptr())); + try { + recv=client->getComponent("MANAGEMENT/Writer1",0,true); + if (CORBA::is_nil(recv.in())==true) { + _EXCPT(ClientErrors::CouldntAccessComponentExImpl,impl,"::main()"); + impl.setComponentName("MANAGEMENT/Writer1"); + impl.log(); + exit(-1); + } + } + catch(CORBA::SystemException &E) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"::main()"); + impl.setName(E._name()); + impl.setMinor(E.minor()); + impl.log(); + exit(-1); + } + catch (maciErrType::CannotGetComponentExImpl& E) { + _ADD_BACKTRACE(ClientErrors::CouldntAccessComponentExImpl,impl,E,"::main()"); + impl.setComponentName("MANAGEMENT/Writer1"); + impl.log(); + exit(-1); + } + catch(...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"::main()"); + impl.log(); + exit(-1); + } + ACS_LOG(LM_FULL_INFO,"::main()",(LM_INFO,"GOT_COMPONENENT: %s","MANAGEMENT/Writer1")); + ACS_LOG(LM_FULL_INFO,"::main()",(LM_DEBUG,"Reference is: %d",recv.ptr())); + ACS_LOG(LM_FULL_INFO,"::main()",(LM_INFO,"ALL_COMPONENTS_RETRIEVED")); + + ACE_OS::sleep(1); + try { + sender->connect(recv.in()); + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"::main() connect"); + impl.log(); + } + + try { + /* Add all component properties here */ + _GET_ACS_PROPERTY(ACS::ROuLongLong,time); + _GET_ACS_PROPERTY(ACS::ROlong,inputsNumber); + _GET_ACS_PROPERTY(ACS::ROlong,integration); + _GET_ACS_PROPERTY(ACS::ROpattern,status); + _GET_ACS_PROPERTY(Management::ROTBoolean,busy); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,attenuation); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,bandWidth); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,frequency); + _GET_ACS_PROPERTY(ACS::ROdoubleSeq,sampleRate); + _GET_ACS_PROPERTY(ACS::ROlongSeq,polarization); + _GET_ACS_PROPERTY(ACS::ROlongSeq,bins); + _GET_ACS_PROPERTY(ACS::ROlongSeq,feed); + _GET_ACS_PROPERTY(ACS::ROstring,fileName); +//DA IMPLEMENTARE LA GESTIONE DELLO STATO!!! +// ACS::ROpattern_var state=new ACS::pattern; +// if (status.ptr()!= ACS::ROpattern::_nil()) _GET_PROPERTY_VALUE_ONCE(state,status,"status"); +// if(state)w.spec.SetModo8bit(..); + w.spec.SetModo8bit(false); + if (inputsNumber.ptr()!= ACS::ROlong::_nil()) _GET_PROPERTY_VALUE_ONCE(N,inputsNumber,"inputsNumber"); + if (integration.ptr()!= ACS::ROlong::_nil()) _GET_PROPERTY_VALUE_ONCE(integ,integration,"integration"); + ACS::doubleSeq_var freq= new ACS::doubleSeq; + ACS::longSeq_var pol= new ACS::longSeq; + ACS::doubleSeq_var bw= new ACS::doubleSeq; + ACS::doubleSeq_var att= new ACS::doubleSeq; + ACS::longSeq_var bs=new ACS::longSeq; + ACS::longSeq_var fd=new ACS::longSeq; + freq->length(N); + pol->length(N); + bw->length(N); + att->length(N); + bs->length(N); + fd->length(N); + char *file; + if (frequency.ptr()!= ACS::ROdoubleSeq::_nil()) _GET_PROPERTY_VALUE_ONCE(freq,frequency,"frequency"); + if (polarization.ptr()!= ACS::ROlongSeq::_nil()) _GET_PROPERTY_VALUE_ONCE(pol,polarization,"polarization"); + if (bandWidth.ptr()!= ACS::ROdoubleSeq::_nil()) _GET_PROPERTY_VALUE_ONCE(bw,bandWidth,"bandWidth"); + if (attenuation.ptr()!= ACS::ROdoubleSeq::_nil()) _GET_PROPERTY_VALUE_ONCE(att,attenuation,"attenuation"); + if (bins.ptr()!= ACS::ROlongSeq::_nil()) _GET_PROPERTY_VALUE_ONCE(bs,bins,"binds"); + if (feed.ptr()!= ACS::ROlongSeq::_nil()) _GET_PROPERTY_VALUE_ONCE(fd,feed,"feed"); + if (fileName.ptr()!=ACS::ROstring::_nil()) _GET_PROPERTY_VALUE_ONCE(file,fileName,"fileName"); + V=w.spec.GetNSezioni(); + if(N>V){ + for(i=V;iterminate(); + sender->disconnect(); + recv->closeReceiver(); + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"::main()"); + impl.log(); + } + ACE_OS::sleep(1); + try { + client->manager()->release_component(client->handle(),"Backends/XBackends"); + client->manager()->release_component(client->handle(),"MANAGEMENT/Writer1"); + } + catch (maciErrType::CannotReleaseComponentExImpl& E) { + E.log(); + } + ACS_LOG(LM_FULL_INFO,"::main()",(LM_INFO,"COMPONENTS_RELEASED")); + + // Releasing client + if (loggedIn) client->logout(); + + // Delete GUIs + //delete &w; + a.exit(); + + ACE_OS::sleep(3); + + return 0; + +} diff --git a/Common/Clients/XBackendClient/src/XControlSystem.cpp b/Common/Clients/XBackendClient/src/XControlSystem.cpp new file mode 100644 index 000000000..1ae6efbc5 --- /dev/null +++ b/Common/Clients/XBackendClient/src/XControlSystem.cpp @@ -0,0 +1,136 @@ +// System includes +#include +#include +#include + +// ACS includes +#include +#include +#include "XControlSystem.h" + +// QT includes + +XControlSystem::XControlSystem (QObject *parent) : QThread(parent) +{ + BUSY=false; + eventEnd = false; + NameFile.Format(""); +} + +//XControlSystem::~XControlSystem() +//{ +//} + +void XControlSystem::setSimpleClient (maci::SimpleClient* theClient) +{ + sc = theClient; +} + +void XControlSystem::stop () +{ + eventEnd = true; +} + +void XControlSystem::setSender (Backends::XBackends_var theSender) +{ + tSender = theSender; +} + +void XControlSystem::setRecv (Management::FitsWriter_var theRecv) +{ + tRecv = theRecv; +} + +void XControlSystem::run()//Main +{ + try { + // status +// printf("*********************ENTRO NEL RUN"); + ACS::ROpattern_var Status_var= tSender->status(); + if (Status_var.ptr() ==ACS::ROpattern::_nil()) { + ACE_CString ACE_Error_str("No access to Status property"); + _EXCPT(ClientErrors::CouldntAccessPropertyExImpl,impl,"XControlSystemClient::Main() run"); + impl.setPropertyName(ACE_Error_str); + impl.log(); + } + // status monitor + ACS::CBpattern_var Status_cb = _this(); + ACS::CBDescIn Status_desc; + ACS::Monitorpattern_var Status_md = Status_var->create_monitor(Status_cb.in(), Status_desc); + if (Status_md.ptr() != ACS::Monitorpattern::_nil()) + Status_md->set_timer_trigger(MONITOR_TIME_TRIGGER); + else { + ACE_CString ACE_Error_str("Status Monitor: No Action"); + _EXCPT(ClientErrors::CouldntPerformActionExImpl,impl,"XControlSystemClient::Main() run"); + impl.setAction(ACE_Error_str); + impl.log(); + } + eventEnd = false; + ACE_Time_Value t; + while (!eventEnd) { + t.set (5L, 0L); + sc->run(t); + } +// printf("ESCO AL RUN**************************\n"); + //printf("\n NameFile %s",(const char *)NameFile); + // Destroy monitors + Status_md->destroy(); + ACE_OS::sleep(1); + } + catch (CORBA::SystemException &Ex) { + _EXCPT(ClientErrors::CORBAProblemExImpl,impl,"XControlSystemGUIClient::Main run()"); + impl.setName(Ex._name()); + impl.setMinor(Ex.minor()); + impl.log(); + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"XControlSystemGUIClient::Main run()"); + impl.log(); + } +} + +void XControlSystem::working(ACS::pattern Status_val, const ACSErr::Completion &c, const ACS::CBDescOut &desc) throw (CORBA::SystemException) +{ + char status=0x00; + ACSErr::Completion_var cmpl; + CompletionImpl comp(c); + char * fp; + if (comp.isErrorFree()){ + status=Status_val; + + if ((status&0x08)&&(!(status&0x20))){ + try { + ACS::ROstring_var FileName_var= tSender->fileName(); + if (FileName_var.ptr()!=ACS::ROstring::_nil()){ + fp=FileName_var->get_sync(cmpl.out()); + NameFile.Format(fp); + //printf("\n fp %s",fp); + } + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"XControlSystemGUIClient::working()"); + impl.log(); + } + } + try { + Management::ROTBoolean_var busy_var= tSender->busy(); + if (busy_var.ptr()!=Management::ROTBoolean::_nil()){ + BUSY=busy_var->get_sync(cmpl.out()); + } + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"XControlSystemGUIClient::working()"); + impl.log(); + } + emit upState(status);//Aggiorno lo stato nella Gui + } + else { + comp.log(); + } +} + +void XControlSystem::done(ACS::pattern Status_val, const ACSErr::Completion &c, const ACS::CBDescOut &desc) throw (CORBA::SystemException) +{ +} + + diff --git a/Common/Clients/XBackendClient/src/headResult.cpp b/Common/Clients/XBackendClient/src/headResult.cpp new file mode 100644 index 000000000..5b2cad56e --- /dev/null +++ b/Common/Clients/XBackendClient/src/headResult.cpp @@ -0,0 +1,45 @@ +#include "headResult.h" + + +HeadResult::HeadResult ( ) {// Constructors + +//SetZeroHeadResult(); +initAttributes(); +} + +HeadResult::~HeadResult ( ) { }//Destructors + + +void HeadResult::initAttributes ( ) { + + flo=25.0* 1e6; + gain=2;//20 + banda=125* 1e6; + adc=5; + index=0; + modoPol=false;//true; +} + +void HeadResult::SetZeroHeadResult ( ) {//Spettrometro non usato + + flo=0.0; + banda=125.e6; + gain=0.0; + adc=0; + index=-1; + modoPol=false;//DA chiedere**************************** +} + +bool HeadResult::operator==(const HeadResult & second) const +{ + return (adc == second.adc) && (flo == second.flo) + && (gain == second.gain)&& (index == second.index) + && (modoPol == second.modoPol)&& (banda == second.banda); +} + +bool HeadResult::operator!=(const HeadResult & second) const +{ + return (adc != second.adc) || (flo != second.flo) + ||(gain != second.gain)|| (index != second.index) + ||(modoPol != second.modoPol)||(banda != second.banda); +} diff --git a/Common/Clients/XBackendClient/src/moc_XControlSystem.cpp b/Common/Clients/XBackendClient/src/moc_XControlSystem.cpp new file mode 100644 index 000000000..475595c3b --- /dev/null +++ b/Common/Clients/XBackendClient/src/moc_XControlSystem.cpp @@ -0,0 +1,78 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'XControlSystem.h' +** +** Created: Fri May 21 18:12:31 2010 +** by: The Qt Meta Object Compiler version 59 (Qt 4.3.4) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "../include/XControlSystem.h" +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'XControlSystem.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 59 +#error "This file was generated using the moc from 4.3.4. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +static const uint qt_meta_data_XControlSystem[] = { + + // content: + 1, // revision + 0, // classname + 0, 0, // classinfo + 1, 10, // methods + 0, 0, // properties + 0, 0, // enums/sets + + // signals: signature, parameters, type, tag, flags + 23, 16, 15, 15, 0x05, + + 0 // eod +}; + +static const char qt_meta_stringdata_XControlSystem[] = { + "XControlSystem\0\0status\0upState(char)\0" +}; + +const QMetaObject XControlSystem::staticMetaObject = { + { &QThread::staticMetaObject, qt_meta_stringdata_XControlSystem, + qt_meta_data_XControlSystem, 0 } +}; + +const QMetaObject *XControlSystem::metaObject() const +{ + return &staticMetaObject; +} + +void *XControlSystem::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_XControlSystem)) + return static_cast(const_cast< XControlSystem*>(this)); + if (!strcmp(_clname, "POA_ACS::CBpattern")) + return static_cast< POA_ACS::CBpattern*>(const_cast< XControlSystem*>(this)); + return QThread::qt_metacast(_clname); +} + +int XControlSystem::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QThread::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + switch (_id) { + case 0: upState((*reinterpret_cast< char(*)>(_a[1]))); break; + } + _id -= 1; + } + return _id; +} + +// SIGNAL 0 +void XControlSystem::upState(char _t1) +{ + void *_a[] = { 0, const_cast(reinterpret_cast(&_t1)) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); +} diff --git a/Common/Clients/XBackendClient/src/moc_plot.cpp b/Common/Clients/XBackendClient/src/moc_plot.cpp new file mode 100644 index 000000000..299e4e960 --- /dev/null +++ b/Common/Clients/XBackendClient/src/moc_plot.cpp @@ -0,0 +1,75 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'plot.h' +** +** Created: Thu Dec 10 11:02:51 2009 +** by: The Qt Meta Object Compiler version 59 (Qt 4.2.1) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "../include/plot.h" +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'plot.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 59 +#error "This file was generated using the moc from 4.2.1. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +static const uint qt_meta_data_Plot[] = { + + // content: + 1, // revision + 0, // classname + 0, 0, // classinfo + 3, 10, // methods + 0, 0, // properties + 0, 0, // enums/sets + + // slots: signature, parameters, type, tag, flags + 17, 6, 5, 5, 0x0a, + 60, 46, 5, 5, 0x0a, + 117, 97, 5, 5, 0x0a, + + 0 // eod +}; + +static const char qt_meta_stringdata_Plot[] = { + "Plot\0\0x,y1,count\0setDamp(double*,double*,int)\0x,y1,y2,count\0" + "setDamp(double*,double*,double*,int)\0x,y1,y2,y3,y4,count\0" + "setDamp(double*,double*,double*,double*,double*,int)\0" +}; + +const QMetaObject Plot::staticMetaObject = { + { &QwtPlot::staticMetaObject, qt_meta_stringdata_Plot, + qt_meta_data_Plot, 0 } +}; + +const QMetaObject *Plot::metaObject() const +{ + return &staticMetaObject; +} + +void *Plot::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_Plot)) + return static_cast(const_cast(this)); + return QwtPlot::qt_metacast(_clname); +} + +int Plot::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QwtPlot::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + switch (_id) { + case 0: setDamp((*reinterpret_cast< double*(*)>(_a[1])),(*reinterpret_cast< double*(*)>(_a[2])),(*reinterpret_cast< int(*)>(_a[3]))); break; + case 1: setDamp((*reinterpret_cast< double*(*)>(_a[1])),(*reinterpret_cast< double*(*)>(_a[2])),(*reinterpret_cast< double*(*)>(_a[3])),(*reinterpret_cast< int(*)>(_a[4]))); break; + case 2: setDamp((*reinterpret_cast< double*(*)>(_a[1])),(*reinterpret_cast< double*(*)>(_a[2])),(*reinterpret_cast< double*(*)>(_a[3])),(*reinterpret_cast< double*(*)>(_a[4])),(*reinterpret_cast< double*(*)>(_a[5])),(*reinterpret_cast< int(*)>(_a[6]))); break; + } + _id -= 3; + } + return _id; +} diff --git a/Common/Clients/XBackendClient/src/moc_xclientGUIui.cpp b/Common/Clients/XBackendClient/src/moc_xclientGUIui.cpp new file mode 100644 index 000000000..f4bf8c71b --- /dev/null +++ b/Common/Clients/XBackendClient/src/moc_xclientGUIui.cpp @@ -0,0 +1,117 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'xclientGUIui.h' +** +** Created: Fri May 21 18:12:31 2010 +** by: The Qt Meta Object Compiler version 59 (Qt 4.3.4) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "../include/xclientGUIui.h" +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'xclientGUIui.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 59 +#error "This file was generated using the moc from 4.3.4. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +static const uint qt_meta_data_xclientGUIui[] = { + + // content: + 1, // revision + 0, // classname + 0, 0, // classinfo + 15, 10, // methods + 0, 0, // properties + 0, 0, // enums/sets + + // signals: signature, parameters, type, tag, flags + 18, 13, 14, 13, 0x05, + + // slots: signature, parameters, type, tag, flags + 46, 44, 13, 13, 0x0a, + 64, 13, 13, 13, 0x0a, + 75, 13, 13, 13, 0x0a, + 102, 92, 87, 13, 0x0a, + 126, 13, 13, 13, 0x0a, + 134, 13, 13, 13, 0x0a, + 144, 13, 13, 13, 0x0a, + 155, 13, 13, 13, 0x0a, + 166, 13, 13, 13, 0x0a, + 178, 13, 13, 13, 0x0a, + 189, 13, 13, 13, 0x0a, + 212, 13, 13, 13, 0x0a, + 242, 235, 13, 13, 0x0a, + 261, 13, 13, 13, 0x0a, + + 0 // eod +}; + +static const char qt_meta_stringdata_xclientGUIui[] = { + "xclientGUIui\0\0int\0setGUICatchAllErrorCode()\0" + "N\0Rivisualizza(int)\0FileExit()\0" + "OpenXplot()\0bool\0path,name\0" + "OpenFile(char[],char[])\0Check()\0" + "Integra()\0StartInt()\0AbortInt()\0" + "Broadcast()\0Modifica()\0Successivo_activated()\0" + "Precedente_activated()\0status\0" + "UpdateStatus(char)\0changeGUICatchAllErrorCode()\0" +}; + +const QMetaObject xclientGUIui::staticMetaObject = { + { &QMainWindow::staticMetaObject, qt_meta_stringdata_xclientGUIui, + qt_meta_data_xclientGUIui, 0 } +}; + +const QMetaObject *xclientGUIui::metaObject() const +{ + return &staticMetaObject; +} + +void *xclientGUIui::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_xclientGUIui)) + return static_cast(const_cast< xclientGUIui*>(this)); + return QMainWindow::qt_metacast(_clname); +} + +int xclientGUIui::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QMainWindow::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + switch (_id) { + case 0: { int _r = setGUICatchAllErrorCode(); + if (_a[0]) *reinterpret_cast< int*>(_a[0]) = _r; } break; + case 1: Rivisualizza((*reinterpret_cast< int(*)>(_a[1]))); break; + case 2: FileExit(); break; + case 3: OpenXplot(); break; + case 4: { bool _r = OpenFile((*reinterpret_cast< char(*)[]>(_a[1])),(*reinterpret_cast< char(*)[]>(_a[2]))); + if (_a[0]) *reinterpret_cast< bool*>(_a[0]) = _r; } break; + case 5: Check(); break; + case 6: Integra(); break; + case 7: StartInt(); break; + case 8: AbortInt(); break; + case 9: Broadcast(); break; + case 10: Modifica(); break; + case 11: Successivo_activated(); break; + case 12: Precedente_activated(); break; + case 13: UpdateStatus((*reinterpret_cast< char(*)>(_a[1]))); break; + case 14: changeGUICatchAllErrorCode(); break; + } + _id -= 15; + } + return _id; +} + +// SIGNAL 0 +int xclientGUIui::setGUICatchAllErrorCode() +{ + int _t0; + void *_a[] = { const_cast(reinterpret_cast(&_t0)) }; + QMetaObject::activate(this, &staticMetaObject, 0, _a); + return _t0; +} diff --git a/Common/Clients/XBackendClient/src/moc_xplot.cpp b/Common/Clients/XBackendClient/src/moc_xplot.cpp new file mode 100644 index 000000000..1d7652650 --- /dev/null +++ b/Common/Clients/XBackendClient/src/moc_xplot.cpp @@ -0,0 +1,92 @@ +/**************************************************************************** +** Meta object code from reading C++ file 'xplot.h' +** +** Created: Fri May 21 18:12:31 2010 +** by: The Qt Meta Object Compiler version 59 (Qt 4.3.4) +** +** WARNING! All changes made in this file will be lost! +*****************************************************************************/ + +#include "../include/xplot.h" +#if !defined(Q_MOC_OUTPUT_REVISION) +#error "The header file 'xplot.h' doesn't include ." +#elif Q_MOC_OUTPUT_REVISION != 59 +#error "This file was generated using the moc from 4.3.4. It" +#error "cannot be used with the include files from this version of Qt." +#error "(The moc has changed too much.)" +#endif + +static const uint qt_meta_data_Xplot[] = { + + // content: + 1, // revision + 0, // classname + 0, 0, // classinfo + 10, 10, // methods + 0, 0, // properties + 0, 0, // enums/sets + + // slots: signature, parameters, type, tag, flags + 7, 6, 6, 6, 0x0a, + 30, 6, 6, 6, 0x0a, + 57, 53, 6, 6, 0x0a, + 69, 6, 6, 6, 0x0a, + 80, 6, 6, 6, 0x0a, + 98, 95, 6, 6, 0x0a, + 126, 6, 6, 6, 0x0a, + 143, 139, 6, 6, 0x08, + 161, 157, 6, 6, 0x08, + 185, 182, 6, 6, 0x08, + + 0 // eod +}; + +static const char qt_meta_stringdata_Xplot[] = { + "Xplot\0\0Successivo_activated()\0" + "Precedente_activated()\0tmp\0Visual(int)\0" + "initPlot()\0plotDataZero()\0tp\0" + "plotData(DataIntegrazione*)\0enableZoom()\0" + "pos\0moved(QPoint)\0pol\0selected(QwtPolygon)\0" + "on\0enableZoomMode(bool)\0" +}; + +const QMetaObject Xplot::staticMetaObject = { + { &QWidget::staticMetaObject, qt_meta_stringdata_Xplot, + qt_meta_data_Xplot, 0 } +}; + +const QMetaObject *Xplot::metaObject() const +{ + return &staticMetaObject; +} + +void *Xplot::qt_metacast(const char *_clname) +{ + if (!_clname) return 0; + if (!strcmp(_clname, qt_meta_stringdata_Xplot)) + return static_cast(const_cast< Xplot*>(this)); + return QWidget::qt_metacast(_clname); +} + +int Xplot::qt_metacall(QMetaObject::Call _c, int _id, void **_a) +{ + _id = QWidget::qt_metacall(_c, _id, _a); + if (_id < 0) + return _id; + if (_c == QMetaObject::InvokeMetaMethod) { + switch (_id) { + case 0: Successivo_activated(); break; + case 1: Precedente_activated(); break; + case 2: Visual((*reinterpret_cast< int(*)>(_a[1]))); break; + case 3: initPlot(); break; + case 4: plotDataZero(); break; + case 5: plotData((*reinterpret_cast< DataIntegrazione*(*)>(_a[1]))); break; + case 6: enableZoom(); break; + case 7: moved((*reinterpret_cast< const QPoint(*)>(_a[1]))); break; + case 8: selected((*reinterpret_cast< const QwtPolygon(*)>(_a[1]))); break; + case 9: enableZoomMode((*reinterpret_cast< bool(*)>(_a[1]))); break; + } + _id -= 10; + } + return _id; +} diff --git a/Common/Clients/XBackendClient/src/plot.cpp b/Common/Clients/XBackendClient/src/plot.cpp new file mode 100644 index 000000000..d86829650 --- /dev/null +++ b/Common/Clients/XBackendClient/src/plot.cpp @@ -0,0 +1,138 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "plot.h" + + +Plot::Plot(QWidget *parent): //Costruttore della classe + QwtPlot(parent) +{ + setAutoReplot(false); + + setCanvasBackground(QColor(Qt::white)); + + // legend + QwtLegend *legend = new QwtLegend; + legend->setFrameStyle(QFrame::Sunken); + insertLegend(legend, QwtPlot::RightLegend); + + // grid + QwtPlotGrid *grid = new QwtPlotGrid; + grid->enableXMin(true); + grid->setMajPen(QPen(Qt::blue, 0, Qt::DotLine)); + grid->setMinPen(QPen(Qt::gray, 0 , Qt::DotLine)); + grid->attach(this); + + // axes + setAxisTitle(QwtPlot::xBottom, "Frequency (MHz)"); + setAxisTitle(QwtPlot::yLeft, "Amplitude"); + + setAxisScaleEngine(QwtPlot::xBottom, new QwtLinearScaleEngine); + setAxisScaleEngine(QwtPlot::yLeft, new QwtLinearScaleEngine); + + // curves + d_crv1 = new QwtPlotCurve("Xx"); + d_crv1->setRenderHint(QwtPlotItem::RenderAntialiased); + d_crv1->setPen(QPen(Qt::blue)); + d_crv1->setYAxis(QwtPlot::yLeft); + d_crv1->attach(this); + + d_crv2 = new QwtPlotCurve("Yy"); + d_crv2->setRenderHint(QwtPlotItem::RenderAntialiased); + d_crv2->setPen(QPen(Qt::red)); + d_crv2->setYAxis(QwtPlot::yLeft); + d_crv2->attach(this); + + d_crv3 = new QwtPlotCurve("Xy.Real"); + d_crv3->setRenderHint(QwtPlotItem::RenderAntialiased); + d_crv3->setPen(QPen(Qt::cyan)); + d_crv3->setYAxis(QwtPlot::yLeft); + d_crv3->attach(this); + + d_crv4 = new QwtPlotCurve("Xy.Imag"); + d_crv4->setRenderHint(QwtPlotItem::RenderAntialiased); + d_crv4->setPen(QPen(Qt::magenta)); + d_crv4->setYAxis(QwtPlot::yLeft); + d_crv4->attach(this); + + setAutoReplot(true); +} + + +void Plot::showData(//Visualizza i le curve + double *x,//varori delle ascisse + double *y1,//varori delle ordinate della curva Ch A + int count)//Numero di punti da disegnare +{ + d_crv1->setData(x, y1, count);//Ch A + +} + +void Plot::showData(//Visualizza i le curve + double *x,//varori delle ascisse + double *y1,//varori delle ordinate della curva Ch A + double *y2,//varori delle ordinate della curva Ch B + int count)//Numero di punti da disegnare +{ + d_crv1->setData(x, y1, count);//Ch A + d_crv2->setData(x, y2, count);//Ch B +} + +void Plot::showData(//Visualizza i le curve + double *x,//varori delle ascisse + double *y1,//varori delle ordinate della curva Ch A + double *y2,//varori delle ordinate della curva Ch B + double *y3,//varori delle ordinate della curva Ch Real + double *y4,//varori delle ordinate della curva Ch Imag + int count)//Numero di punti da disegnare +{ + d_crv1->setData(x, y1, count);//Ch A + d_crv2->setData(x, y2, count);//Ch B + d_crv3->setData(x, y3, count);//Ch Real + d_crv4->setData(x, y4, count);//Ch Imag +} + +void Plot::setDamp(//Visualizza i le curve + double *x,//varori delle ascisse + double *y1,//varori delle ordinate della curva Ch A + int count)//Numero di punti da disegnare +{ + const bool doReplot = autoReplot(); + setAutoReplot(false); + showData(x, y1, count); + setAutoReplot(doReplot); + replot(); +} + +void Plot::setDamp(//Visualizza i le curve + double *x,//varori delle ascisse + double *y1,//varori delle ordinate della curva Ch A + double *y2,//varori delle ordinate della curva Ch B + int count)//Numero di punti da disegnare +{ + const bool doReplot = autoReplot(); + setAutoReplot(false); + showData(x, y1, y2, count); + setAutoReplot(doReplot); + replot(); +} + +void Plot::setDamp(//Visualizza i le curve + double *x,//varori delle ascisse + double *y1,//varori delle ordinate della curva Ch A + double *y2,//varori delle ordinate della curva Ch B + double *y3,//varori delle ordinate della curva Ch Real + double *y4,//varori delle ordinate della curva Ch Imag + int count)//Numero di punti da disegnare +{ + const bool doReplot = autoReplot(); + setAutoReplot(false); + showData(x, y1, y2, y3, y4, count); + setAutoReplot(doReplot); + replot(); +} diff --git a/Common/Clients/XBackendClient/src/xclientGUI.ui b/Common/Clients/XBackendClient/src/xclientGUI.ui new file mode 100644 index 000000000..d32759b41 --- /dev/null +++ b/Common/Clients/XBackendClient/src/xclientGUI.ui @@ -0,0 +1,537 @@ + + ClientClass + + + + 0 + 0 + 703 + 379 + + + + Xarcos Client + + + + + 9 + + + 6 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + Setting + + + + 9 + + + 6 + + + + + 0 + + + 6 + + + + + 0 + + + 6 + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Central frequency (MHz)</p></body></html> + + + + + + + + + + + + 0 + + + 6 + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;">Gain</p></body></html> + + + + + + + 255 + + + 20 + + + + + + + + + 0 + + + 6 + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:9pt;">ChIn</p></body></html> + + + + + + + 15 + + + + + + + + + 0 + + + 6 + + + + + Band + + + + + + + 1 + + + + 125. + + + + + 62.5 + + + + + 31.2 + + + + + 15.6 + + + + + 7.81 + + + + + 3.91 + + + + + 1.95 + + + + + .976 + + + + + .488 + + + + + 0 + + + + + + + + + + 0 + + + 6 + + + + + Polarimetric Mode + + + true + + + + + + + + + + + 0 + + + 6 + + + + + N Section + + + + + + + + 31 + 16777215 + + + + true + + + + + + + << + + + + + + + >> + + + + + + + Qt::Horizontal + + + + 278 + 20 + + + + + + + + Broadcast + + + + + + + + + + + + 0 + + + 6 + + + + + Int.time [min] + + + + + + + + + + Repeat + + + + + + + true + + + + + + + false + + + Quantization 8 Bit + + + false + + + false + + + + + + + + + 0 + + + 6 + + + + + + + + + + 140 + 210 + + + + Status + + + + 9 + + + 6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 6 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + 0 + + + 6 + + + + + Integration + + + + + + + false + + + Abort + + + + + + + false + + + Start + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + 0 + 0 + 703 + 25 + + + + + &View + + + + + + &File + + + + + + + + + + E&xit + + + + + X&Plot + + + + + + diff --git a/Common/Clients/XBackendClient/src/xclientGUIui.cpp b/Common/Clients/XBackendClient/src/xclientGUIui.cpp new file mode 100644 index 000000000..c730add41 --- /dev/null +++ b/Common/Clients/XBackendClient/src/xclientGUIui.cpp @@ -0,0 +1,609 @@ +#include "../include/xclientGUIui.h" +#include "Qt/qmessagebox.h" +#include +#define MAX_GAIN 256 +#define MAXBINS 4096 + +//static char hostname[]="localhost"; + +xclientGUIui::xclientGUIui(QWidget *parent) +: QMainWindow(parent) +{ + DataIntegrazione Risul; + + ui.setupUi(this); + connect( ui.action_Exit, SIGNAL( activated() ), this, SLOT( FileExit() ) ); + connect( ui.actionXPlot, SIGNAL( activated() ), this, SLOT( OpenXplot() ) ); + connect( ui.pushButtonPrec, SIGNAL( clicked() ), this, SLOT( Precedente_activated() ) ); + connect( ui.pushButtonSucc, SIGNAL( clicked() ), this, SLOT( Successivo_activated() ) ); + connect( ui.pushButtonInt, SIGNAL( clicked() ), this, SLOT( Integra() ) ); + connect( ui.Modo8Bit, SIGNAL( clicked() ), this, SLOT( Check() ) ); + connect( ui.pushButtonStart,SIGNAL( clicked() ), this, SLOT( StartInt() )); + connect( ui.pushButtonAbort,SIGNAL( clicked() ), this, SLOT( AbortInt() )); + connect( ui.pushButtonBroad,SIGNAL( clicked() ), this, SLOT( Broadcast() )); + connect( &XThread, SIGNAL( upState(char) ), this, SLOT( UpdateStatus(char) )); + connect( &XThread, SIGNAL(setGUICatchAllErrorCode()), this, SLOT(changeGUICatchAllErrorCode())); + initAttributes ( ); + + Risul.SetZeroDataIntegratione(); + RisultatiIntegrazione.reserve(spec.GetMaxSezioni()); + for(int i=0;ishow(); + ledHW=new Led(ui.HW,QString("HW")); + ledData=new Led(ui.Data,QString("DataReady")); + ledOverflowData=new Led(ui.Overflow,QString("OverflowData"),Led::Red); + ledAbort=new Led(ui.Abort,QString("Abort")); + ledActive=new Led(ui.Active,QString("Active")); + ledSetting=new Led(ui.Setting,QString("Setting")); + ledBusy=new Led(ui.Busy,QString("Busy"),Led::Red); + +} + +void xclientGUIui::setParameters(maci::SimpleClient* theClient,Backends::XBackends_var theSender, Management::FitsWriter_var theRecv) +{ + sc=theClient; + sender=theSender; + recv=theRecv; + XThread.setSimpleClient(theClient); + XThread.setSender(theSender); + XThread.setRecv(theRecv); + XThread.start(); + INT=false; +} + +xclientGUIui::~xclientGUIui() +{ + if(p!=NULL) delete p; +} + +void xclientGUIui::OpenXplot(){ + int lung=0,pos=0; + + CString cp(XThread.NameFile); + lung=cp.GetLength(); + if(lung>0){ + char str[lung]; + for (int x=lung-1;x>=0;x--){ + if((pos==0)&&(cp[x]=='/')) pos=x; + str[x]=cp[x]; + } + if(posshow(); + + //p->Visual(groupSpec.Xspec.GetNSezioni()); +} + + +bool xclientGUIui::OpenFile(char path[],char name[]) +{ + int index=0,channel=0,m=0,d=0,lung=0,count=0; + char car='\0'; + bool ok=false; + QString fn(path); //= QFileDialog::getOpenFileName(this, "Choose a file to open", path, QString::null); + char str[512]; + double ch=0,beams=0,sampleSize=0,integration=0,val=0,bins=0,pola=0; + double *vett=new double[(MAXBINS*4)+2]; + HeadResult head; + DataIntegrazione *RisulInt; + vector sezioni; + + head.SetZeroHeadResult(); + sezioni.reserve(spec.GetMaxSezioni()); + for(int i=0;i((ch*8)+3))&&(car==',')))){ + count=0; + in_file.read(&car,1); + while((!(in_file.eof ( )))&&(car!=',')&&(count<512)){ + str[count]=car; + in_file.read(&car,1); + if ((d>((ch*8)+5))&&(car==':')) ok=true; + count++; + } + str[count]='\0'; + switch(d) { + case 0:{ + ch=strtod(str,NULL); + if(!(chSetZeroDataIntegratione(); + RisulInt->SetLungArrayDati((int)bins); + RisulInt->SetTempoIntegrazione((int)integration); + RisulInt->SetXxZero(); + RisulInt->SetYyZero(); + RisulInt->SetXyZero(); + RisulInt->SetTpZero(); + RisulInt->SetValoriValidi(false); + } + } + break; + default: { + if((d==(6+index*8))&&(d<((ch*8)+5))){ + head.SetZeroHeadResult(); + pola=strtod(str,NULL); + if ((pola==0)||(pola==1)) head.SetModoPol(false); + else if(pola==2) head.SetModoPol(true); + else return false; + head.Setindex(index); + sezioni[index]=head; + index++; + } + } + } + if (d>((ch*8)+4)){ + val=strtod(str,NULL); + if((m<(bins*4)+2)&&(!ok)) vett[m]=val; + m++; + if(ok){//il +2 sono i tp + if(channelSetHead(sezioni[channel]); + RisulInt->SetXx(&vett[2]); + RisulInt->SetTp(vett,2,true); + RisulInt->SetValoriValidi(true); + channel++; + for(int j=0;j<(bins*4)+2;j++) vett[j]=0; + m=0; + ok=false; + } + else { + + RisulInt->SetHead(sezioni[channel]); + RisulInt->SetXx(&vett[2]); + RisulInt->SetYy(&vett[2]); + RisulInt->SetXy(&vett[2]); + RisulInt->SetTp(vett,2,true); + RisulInt->SetValoriValidi(true); + channel++; + for(int j=0;j<(bins*4)+2;j++) vett[j]=0; + m=0; + ok=false; + } + } + } + } + d++; + } + } + if(channelSetHead(sezioni[channel]); + RisulInt->SetXx(&vett[2]); + RisulInt->SetTp(vett,2,true); + RisulInt->SetValoriValidi(true); + channel++; + } + else { + RisulInt->SetHead(sezioni[channel]); + RisulInt->SetXx(&vett[2]); + RisulInt->SetYy(&vett[2]); + RisulInt->SetXy(&vett[2]); + RisulInt->SetTp(vett,2,true); + RisulInt->SetValoriValidi(true); + channel++; + } + } + } + } + delete[] vett; + p->Visual((int)ch); + return true; +} + +void xclientGUIui::UpdateStatus(char status) +{ + if (status&0x80) ledHW->setColor(Led::Green); + else ledHW->setColor(Led::Red); + if(status&0x08)ledData->setMode(Led::On); + else ledData->setMode(Led::Off); + if(status&0x40)ledSetting->setMode(Led::On); + else ledSetting->setMode(Led::Off); + if(status&0x20)ledActive->setMode(Led::On); + else ledActive->setMode(Led::Off); + if(status&0x10)ledAbort->setMode(Led::On); + else ledAbort->setMode(Led::Off); + if(status&0x04)ledOverflowData->setMode(Led::On); + else ledOverflowData->setMode(Led::Off); + if(!(XThread.BUSY)) ledBusy->setMode(Led::On); + else ledBusy->setMode(Led::Off); + + if((INT)&&((status&0x10) ||((status&0x08)&&(!(status&0x20))))){ + ui.pushButtonAbort->setEnabled(false); + ui.pushButtonInt->setEnabled(true); + ui.pushButtonStart->setEnabled(false); + ui.Modo8Bit->setEnabled(true); + ui.ModoPol->setEnabled(true); + ui.bandBox->setEnabled(true); + SetReadOnly(false); + INT=false; + + if(status&0x08){ + AbortInt(); + OpenXplot(); + } + } +} + +void xclientGUIui::FileExit(){ + XThread.stop(); + if (XThread.isRunning() == true) { + while (XThread.isFinished() == false) + XThread.wait(); + } + XThread.terminate(); + try { + sender->terminate(); + sender->disconnect(); + recv->closeReceiver(); + } + catch (...) { + _EXCPT(ClientErrors::UnknownExImpl,impl,"::FileExit()"); + impl.log(); + } + ACE_OS::sleep(1); + try { + sc->manager()->release_component(sc->handle(),"Backends/XBackends"); + sc->manager()->release_component(sc->handle(),"MANAGEMENT/Writer1"); + } + catch (maciErrType::CannotReleaseComponentExImpl& E) { + E.log(); + } + ACS_LOG(LM_FULL_INFO,"::FileExit()",(LM_INFO,"COMPONENTS_RELEASED")); + + exit( 0 ); +} + +void xclientGUIui::initAttributes ( ) { + + N=0; + visualizza(N); +} + +void xclientGUIui::Rivisualizza(int N){ + + visualizza(N); +} + +void xclientGUIui::Modifica( ){ + + Salva(N); + visualizza(N); +} + +void xclientGUIui::Salva(int n){ + HeadResult temp; + + if (ui.Modo8Bit->isChecked()==true) spec.SetModo8bit(true); + else spec.SetModo8bit(false); + spec.SetTempoIntegrazione((int)((ui.intTimeLine->displayText().toDouble())*60));//Da minuti-> in secondi + if(spec.GetTempoIntegrazione()setText(QString::number((double)spec.GetTempoIntegrazione()/60, 'f', 3 )); + spec.SetNCicli(ui.repeatBox->value()); + temp.SetZeroHeadResult(); + temp.SetFlo( ui.freqLine->displayText().toDouble() * 1e6); + temp.SetGain(ui.gainBox->value()); + temp.SetAdc(ui.ChInBox->value()); + temp.SetBanda(ui.bandBox->currentText().toDouble() * 1e6); + temp.Setindex(n); + if (ui.ModoPol->isChecked()==true) temp.SetModoPol(true); + else temp.SetModoPol(false); + spec.specificaSezione[n]=temp; +} + +void xclientGUIui::Broadcast(){ + HeadResult temp; + int n=0; + int scelta=0; + + scelta=QMessageBox::question(this,"MessageBox","Do you want setting all the Sections? ",QMessageBox::Yes|QMessageBox::No); + if(scelta==QMessageBox::Yes){ + Salva(N); + //groupSpec.setting=false; + temp=spec.specificaSezione[N];//Sezione al momento visualizzata + for(n=0;nsetEnabled(true); + visualizza(N); + try{ + sender->setSectionsNumber(spec.GetNSezioni()); + sender->setInputsNumber(spec.GetNSezioni()); + } + _CATCH_ALL("xclientGUIui::Integra() setSection()"); + try{ + sender->setIntegration(spec.GetTempoIntegrazione()); + } + _CATCH_ALL("xclientGUIui::Integra() setIntegration()"); + s=0; + while(ssetSection(s,flo,bw,fd,pol,sr,4096); + //sender->setAttenuation(); + //Bisonga settare l'attenuazione!!! + //mount->setChannel(s,flo,bw,sr,att,pol,4096); + } + _CATCH_ALL("xclientGUIui::Integra() setSection()"); + s++; + } + std::cout << str << std::endl; + try{ + //mount->Init(); + sender->sendHeader(); + } + _CATCH_ALL("xclientGUIui::Integra() setSection()"); +ACS_SHORT_LOG((LM_INFO, "xclientGUIui::Integra() %s","Backends/XBackends")); +} + +void xclientGUIui::Successivo_activated(){ + int scelta=0; + + Modifica();//Effettua il Salvataggio Automatico di tutte le impostatazioni + if (N<(spec.GetNSezioni()-1)) N++; + else { + if (N<(spec.GetMaxSezioni()-1)){ + scelta=QMessageBox::question(this,"MessageBox","Do you want create a new Section? ",QMessageBox::Yes|QMessageBox::No); + if(scelta==QMessageBox::Yes){ + spec.SetNSezioni((spec.GetNSezioni()+1)); + spec.InsertElementArray(); + N++; + } + } + } + visualizza(N); +} + +void xclientGUIui::Precedente_activated(){ + + Modifica();//Effettua il Salvataggio Automatico di tutte le impostatazioni + if (N>0) N--; + visualizza(N); +} + +void xclientGUIui::visualizza(int n ){ + HeadResult temp; + int i=0; + double banda=0, tb=0; + + temp=spec.specificaSezione[n]; + if(temp.Getindex()!=-1){ + ui.freqLine->setText(QString::number((temp.GetFlo())* 1e-6, 'f', 6 )); + ui.gainBox->setValue((int)temp.GetGain()); + if (temp.GetModoPol()==true) ui.ModoPol->setChecked(true); + else ui.ModoPol->setChecked(false); + ui.SezioneCorrente->setText(QString::number( n,'i',0 )); + banda=temp.GetBanda( )* 1e-6; + tb=ui.bandBox->itemText(i).toDouble(); + while(banda!=tb){ + i++; + tb=ui.bandBox->itemText(i).toDouble(); + if (i>100) break; + } + if (spec.GetModo8bit()==true){ + ui.ChInBox->setMinimum(2);//setMaximum(5); + ui.Modo8Bit->setChecked(true); + } + else{ + ui.ChInBox->setMinimum(0);//setMaximum(7); + ui.Modo8Bit->setChecked(false); + } + ui.bandBox->setCurrentIndex(i); + ui.intTimeLine->setText(QString::number((double)spec.GetTempoIntegrazione()/60, 'f', 3 )); + ui.repeatBox->setValue(spec.GetNCicli()); + ui.ChInBox->setValue(temp.GetAdc()); + } +} + +void xclientGUIui::Check(){ + int scelta=0; + + scelta=QMessageBox::question(this,"MessageBox","Do you want modify the quantization? ",QMessageBox::Yes|QMessageBox::No); + if(scelta==QMessageBox::Yes){ + spec.ResetArray(); + if(ui.Modo8Bit->isChecked()==true){ + ui.ChInBox->setMinimum(2);//setMaximum(5); + spec.SetModo8bit(true); + //groupSpec.AdcSetMode(spec.GetModo8bilt()); + ui.Modo8Bit->setChecked(true); + } + else{ + ui.ChInBox->setMinimum(0);//setMaximum(7); + spec.SetModo8bit(false); + //groupSpec.AdcSetMode(pec.GetModo8bilt()); + ui.Modo8Bit->setChecked(false); + } + }else{ + if(ui.Modo8Bit->isChecked()!=true){ + ui.ChInBox->setMinimum(2);//setMaximum(5); + spec.SetModo8bit(true); + ui.Modo8Bit->setChecked(true); + } + else{ + ui.ChInBox->setMinimum(0);//setMaximum(7); + spec.SetModo8bit(false); + ui.Modo8Bit->setChecked(false); + } + } + visualizza(N); +} + +void xclientGUIui::AbortInt(){ + + //groupSpec.AbortInt(); + ui.pushButtonAbort->setEnabled(false); + ui.pushButtonInt->setEnabled(true); + ui.pushButtonStart->setEnabled(false); + ui.Modo8Bit->setEnabled(true); + ui.ModoPol->setEnabled(true); + ui.bandBox->setEnabled(true); + SetReadOnly(false); + + try{ + //sender->Abort(); + sender->sendStop(); + } + _CATCH_ALL("xclientGUIui::AbortInt() StopSender()"); + INT=false; +} + +void xclientGUIui::StartInt(){ + + IRA::CString fileName(""); + TIMEVALUE now; + CString nomeFile("XWriter"); + CString backend("Xarcos");//(""); + CString path("/home/Manager/OutXarcos");//(""); + CString observer("dummy"); + + ui.pushButtonAbort->setEnabled(true); + ui.pushButtonInt->setEnabled(false); + ui.pushButtonStart->setEnabled(false); + ui.Modo8Bit->setEnabled(false); + ui.ModoPol->setEnabled(false); + ui.bandBox->setEnabled(false); + SetReadOnly(true); + + IRA::CIRATools::getTime(now); + fileName.Format("%s/%s_%02d_%02d_%02d.fits",(const char *)path,(const char *)nomeFile,now.hour(),now.minute(),now.second()); + + try{ + recv->setFileName((const char*)fileName); + recv->setProjectName("PrototypeProject"); + recv->setObserverName((const char *)observer); + recv->setReceiver("KKC"); + ACS_DEBUG("xclientGUIui::StartInt"," setWriter"); + + } + _CATCH_ALL("xclientGUIui::StartInt() setWriter()"); + try{ + //sender->Start(); + sender->sendData(now.value().value); + ACS_DEBUG("xclientGUIui::StartInt"," SenderData()"); + + } + _CATCH_ALL("xclientGUIui::StartInt() SenderData()"); + INT=true; +} + +void xclientGUIui::SetReadOnly(bool modo){ + + ui.freqLine->setReadOnly(modo); + ui.gainBox->setReadOnly(modo); + ui.ChInBox->setReadOnly(modo); + ui.intTimeLine->setReadOnly(modo); + ui.repeatBox->setReadOnly(modo); +} + +void xclientGUIui::changeGUICatchAllErrorCode() +{ int scelta=0; + +scelta=QMessageBox::question(this,"MessageBox",QCatchAllError,QMessageBox::Yes|QMessageBox::No); + +} diff --git a/Common/Clients/XBackendClient/src/xplot.cpp b/Common/Clients/XBackendClient/src/xplot.cpp new file mode 100644 index 000000000..18e686445 --- /dev/null +++ b/Common/Clients/XBackendClient/src/xplot.cpp @@ -0,0 +1,252 @@ +#include "xplot.h" +#include "DataIntegrazione.h" +#include "plot.h" +#include +#include +#include +#include +#include +#include + +class Zoomer: public QwtPlotZoomer +{ +public: + Zoomer(int xAxis, int yAxis, QwtPlotCanvas *canvas, bool doReplot): + QwtPlotZoomer(xAxis, yAxis, canvas, doReplot){ + + setSelectionFlags(QwtPicker::RectSelection | QwtPicker::CornerToCorner); + setTrackerMode(QwtPicker::AlwaysOff); + setRubberBand(QwtPicker::NoRubberBand); + setMaxStackDepth(-1);//dimensione illimitata + // RightButton: zoom out by 1 + // Ctrl+RightButton: zoom out to full size + setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier); + setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton); + } +}; + +Xplot::Xplot(QWidget *parent,int sez, vector *dati) + : QWidget(parent), MaxSezioni(sez), dato(dati){// Constructors + + ui.setupUi(this); + connect( ui.pushButtonPrec, SIGNAL( clicked() ), this, SLOT( Precedente_activated() ) ); + connect( ui.pushButtonSucc, SIGNAL( clicked() ), this, SLOT( Successivo_activated() ) ); + ui.pushButtonZoom->setIcon(QIcon("../icon/zoomin.png")); + connect( ui.pushButtonZoom, SIGNAL( clicked() ), this, SLOT( enableZoom() ) ); + ZOOM=false; + initPlot(); + N=0; +} + + + + +void Xplot::enableZoom(){ + + ZOOM=!ZOOM; + enableZoomMode(ZOOM); +} + +void Xplot::enableZoomMode(bool on){ + + Base=d_zoomer->zoomRect();//Recupero le dimensioni plottate + d_zoomer->setZoomBase(Base);//pulisco lo stack imponendo le dimensioni già visibili + d_panner->setEnabled(on); + d_zoomer->setEnabled(on); + d_zoomer->zoom(0); + d_picker->setEnabled(true);//!on + if(on) ui.pushButtonZoom->setIcon(QIcon("../icon/zoomin.png")); + else ui.pushButtonZoom->setIcon(QIcon("../icon/zoomout.png")); + showInfo(); +} + +void Xplot::showInfo(QString text){ + + if ( text == QString::null ){ + if ( d_picker->rubberBand() ) + text = "Cursor Pos: Press left mouse button in plot region"; + else + text = "Zoom: Press mouse button and drag"; + } +} + +void Xplot::selected(const QwtPolygon &){ + + showInfo(); +} + +void Xplot::moved(const QPoint &pos){ + + QString info; + info.sprintf("Freq=%g, Ampl=%g", + d_plot->invTransform(QwtPlot::xBottom, pos.x()), + d_plot->invTransform(QwtPlot::yLeft, pos.y())); + showInfo(info); +} + +void Xplot::Visual(int tmp){ + + Sezioni=tmp; + if (Sezioni>MaxSezioni) Sezioni=MaxSezioni; + visualizza(N); +} + + +void Xplot::Successivo_activated(){ + + if (N<(Sezioni-1)){ + ZOOM=false; + enableZoomMode(ZOOM); + N++; + } + visualizza(N); +} + +void Xplot::Precedente_activated(){ + + if (N>0){ + ZOOM=false; + enableZoomMode(ZOOM); + N--; + } + visualizza(N); +} + +void Xplot::visualizza(int n){ + DataIntegrazione di; + + ui.SezioneCorrente->setText(QString::number( n,'f',0 )); + if(dato!=NULL){ + di=(*dato)[n]; + if(di.GetValoriValidi()==true){ + plotData(&di); + }else plotDataZero(); + } +} + +void Xplot::plotDataZero(){ + int nx=4096; + double BufferX[nx]; + double CurvaA[nx]; + double CurvaB[nx]; + double CurvaC[nx]; + double CurvaD[nx]; + double band = 125; // Band in MHz + + for (int i=0; isetDamp(BufferX, CurvaA,CurvaB,CurvaC,CurvaD,nx); +// d_plot->setDamp(BufferX, CurvaA,CurvaB,nx); + ui.Xx->setText(QString::number( 0,'f',0 )); + ui.Yy->setText(QString::number( 0,'f',0 )); + ui.checkOverFlow->setChecked(false); + d_plot->setAxisScale(QwtPlot::xBottom,-band/2,band/2); + d_plot->setAxisScale(QwtPlot::yLeft,0,1000); + Base.setRect(-band/2,0,band,1000); + d_zoomer->setZoomBase(Base); +} + +void Xplot::plotData(DataIntegrazione *di){ + int i, na,nx, nb2,na2; + double BufferX[di->GetLungArrayDati()]; + double CurvaA[di->GetLungArrayDati()]; + double CurvaB[di->GetLungArrayDati()]; + double CurvaC[di->GetLungArrayDati()]; + double CurvaD[di->GetLungArrayDati()]; + + double band =di->GetHead().GetBanda()*1e-6; // Band in MHz + double lo1 = di->GetHead().GetFlo()*1e-6; + double miny=1e99, maxy=-1e99; + double norm=1; + + if (band==125) lo1=0;//centro il plot sulla freq zero in quanto visualizzo tutta la banda + double minx=-band/2 + lo1; + double maxx=band/2 + lo1; + double yval=0; + + norm=1.0/di->GetTempoIntegrazione(); + ui.Xx->setText(QString::number(di->GetTp()[0] ,'e',2 )); + ui.Yy->setText(QString::number(di->GetTp()[1],'e',2 )); + ui.checkOverFlow->setChecked(di->GetOverflow()); + na=nx=di->GetLungArrayDati(); + na2=nb2=di->GetLungArrayDati()/2; + if(di->GetHead().GetModoPol()==true){ + for (i=0; iGetLungArrayDati(); ++i) {// Plot X limits + yval=di->GetXx()[i]*norm; + if (yval > maxy) maxy=yval; // Amplitude limits + if (yval < miny) miny=yval; + yval = di->GetYy()[i]*norm; + if (yval > maxy) maxy=yval; // Amplitude limits + if (yval < miny) miny=yval; + yval = di->GetXy()[i].real()*norm; + if (yval > maxy) maxy=yval; // Amplitude limits + if (yval < miny) miny=yval; + yval = di->GetXy()[i].imag()*norm; + if (yval > maxy) maxy=yval; // Amplitude limits + if (yval < miny) miny=yval; + } + }else{ + for (i=0; iGetLungArrayDati(); ++i) {// Plot X limits + yval =di->GetXx()[i]*norm; + if (yval > maxy) maxy=yval; // Amplitude limits + if (yval < miny) miny=yval; + } + } + double xmin,xmax,ymin,ymax;// Expand limits by 10% + xmin=minx*1.05 - maxx*0.05; + xmax=maxx*1.05 - minx*0.05; + if (miny == maxy) { + ymin = miny*0.99; + ymax = maxy*1.01; + } else { + ymin=miny*1.05 - maxy*0.05; + ymax=maxy*1.05 - miny*0.05; + } + for (i=0; iGetHead().GetModoPol()==true){ + for (i=0; iGetXx()[i]*norm; + for (i=0; iGetYy()[i]*norm; + for (i=0; iGetXy()[i].real()*norm; + for (i=0; iGetXy()[i].imag()*norm; + }else for (i=0; iGetXx()[i]*norm; + + d_plot->setAxisScale(QwtPlot::xBottom,xmin,xmax,0); + d_plot->setAxisScale(QwtPlot::yLeft,ymin,ymax,0); + Base.setRect(xmin-band,ymin,xmax-xmin,ymax-ymin); + d_zoomer->setZoomBase(Base); + + d_plot->setDamp(BufferX, CurvaA, CurvaB,CurvaC,CurvaD,nx);//Disegna le curve + // d_plot->setDamp(BufferX, CurvaA, CurvaB,nx); +} + +void Xplot::initPlot(){ + + d_plot = new Plot(ui.mywidget); + ui.gridLayout1->addWidget(d_plot, 0, 0, 1, 1); + d_zoomer = new Zoomer( QwtPlot::xBottom, QwtPlot::yLeft,d_plot->canvas(),false); + d_zoomer->setRubberBand(QwtPicker::RectRubberBand); + d_zoomer->setRubberBandPen(QColor(Qt::green)); + d_zoomer->setTrackerMode(QwtPicker::ActiveOnly); + d_zoomer->setTrackerPen(QColor(Qt::green)); + d_panner = new QwtPlotPanner(d_plot->canvas()); + d_panner->setMouseButton(Qt::MidButton); + d_picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft, + QwtPicker::PointSelection | QwtPicker::DragSelection, + QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn, + d_plot->canvas()); + d_picker->setRubberBandPen(QColor(Qt::green)); + d_picker->setRubberBand(QwtPicker::CrossRubberBand); + d_picker->setTrackerPen(QColor(Qt::green)); + enableZoomMode(ZOOM); + double band = 125; // Band in MHz + d_plot->setAxisScale(QwtPlot::xBottom,0,band); + d_plot->setAxisScale(QwtPlot::yLeft,0,1000); + Base.setRect(-band/2,0,band,1000); + d_zoomer->setZoomBase(Base); + showInfo(); + connect(d_picker, SIGNAL(moved(const QPoint &)),SLOT(moved(const QPoint &))); + connect(d_picker, SIGNAL(selected(const QwtPolygon &)),SLOT(selected(const QwtPolygon &))); +} + +Xplot::~Xplot(){ }//Destructors diff --git a/Common/Clients/XBackendClient/src/xplotGUI.ui b/Common/Clients/XBackendClient/src/xplotGUI.ui new file mode 100644 index 000000000..bff7e9214 --- /dev/null +++ b/Common/Clients/XBackendClient/src/xplotGUI.ui @@ -0,0 +1,235 @@ + + XplotGUIClass + + + + 0 + 0 + 738 + 360 + + + + Xarcos Plot + + + + 11 + + + 6 + + + + + 11 + + + 6 + + + + + 11 + + + 6 + + + + + Plot region + + + + 11 + + + 6 + + + + + + + + + + + + 165 + 0 + + + + + 130 + 16777215 + + + + Measure Tp + + + + 11 + + + 6 + + + + + 11 + + + 6 + + + + + 11 + + + 6 + + + + + Xx + + + + + + + + 66 + 0 + + + + + 100 + 16777215 + + + + true + + + + + + + Yy + + + + + + + + 66 + 0 + + + + + 100 + 16777215 + + + + true + + + + + + + + + Overflow + + + + + + + + + + + + + + 11 + + + 6 + + + + + N Section + + + + + + + + 31 + 16777215 + + + + true + + + + + + + << + + + + + + + >> + + + + + + + Qt::Horizontal + + + + 428 + 17 + + + + + + + + Zoom + + + + + + + + + + + + + diff --git a/Common/Clients/dummy.txt b/Common/Clients/dummy.txt new file mode 100644 index 000000000..f4760e682 --- /dev/null +++ b/Common/Clients/dummy.txt @@ -0,0 +1 @@ +ACS4SRT diff --git a/Common/Documentation/dummy.txt b/Common/Documentation/dummy.txt new file mode 100644 index 000000000..f4760e682 --- /dev/null +++ b/Common/Documentation/dummy.txt @@ -0,0 +1 @@ +ACS4SRT diff --git a/Common/Errors/AntennaErrors/idl/AntennaErrors.xml b/Common/Errors/AntennaErrors/idl/AntennaErrors.xml new file mode 100644 index 000000000..e0e3000ac --- /dev/null +++ b/Common/Errors/AntennaErrors/idl/AntennaErrors.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Errors/AntennaErrors/src/Makefile b/Common/Errors/AntennaErrors/src/Makefile new file mode 100644 index 000000000..66cf39692 --- /dev/null +++ b/Common/Errors/AntennaErrors/src/Makefile @@ -0,0 +1,90 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.1.1.1 2007-10-26 21:01:43 a.orlati Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 26/10/07 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +#USER_LIB = + +MAKE_PDF = ON + +ACSERRDEF=AntennaErrors + +ERRXMLFILE= ../idl/AntennaErrors.xml + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +TMP := $(shell searchFile /tmp/tmp.txt) +ifeq ($(TMP),\#error\#) +PERM:=$(shell stat --format=%a $(ERRXMLFILE)) +else +PERM=$(shell cat /tmp/tmp.txt) +endif + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @chmod $(PERM) $(ERRXMLFILE) + @echo "Patch applied" + @rm -rf /tmp/tmp.txt + @echo " . . . installation done" + +xmlpatch_pre : + @echo "File permissions: " $(PERM) + @chmod a+w $(ERRXMLFILE) + @echo $(PERM) > /tmp/tmp.txt + + +#___oOo___ diff --git a/Common/Errors/BackendsErrors/idl/BackendsErrors.xml b/Common/Errors/BackendsErrors/idl/BackendsErrors.xml new file mode 100644 index 000000000..f59ab6625 --- /dev/null +++ b/Common/Errors/BackendsErrors/idl/BackendsErrors.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Errors/BackendsErrors/src/Makefile b/Common/Errors/BackendsErrors/src/Makefile new file mode 100644 index 000000000..c7f813328 --- /dev/null +++ b/Common/Errors/BackendsErrors/src/Makefile @@ -0,0 +1,90 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.1 2008-10-02 15:41:57 a.orlati Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 02/10/08 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +#USER_LIB = + +MAKE_PDF = ON + +ACSERRDEF=BackendsErrors + +ERRXMLFILE= ../idl/BackendsErrors.xml + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +TMP := $(shell searchFile /tmp/tmp.txt) +ifeq ($(TMP),\#error\#) +PERM:=$(shell stat --format=%a $(ERRXMLFILE)) +else +PERM=$(shell cat /tmp/tmp.txt) +endif + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @chmod $(PERM) $(ERRXMLFILE) + @echo "Patch applied" + @rm -rf /tmp/tmp.txt + @echo " . . . installation done" + +xmlpatch_pre : + @echo "File permissions: " $(PERM) + @chmod a+w $(ERRXMLFILE) + @echo $(PERM) > /tmp/tmp.txt + + +#___oOo___ diff --git a/Common/Errors/ClientErrors/ChangeLog b/Common/Errors/ClientErrors/ChangeLog new file mode 100644 index 000000000..8162328e0 --- /dev/null +++ b/Common/Errors/ClientErrors/ChangeLog @@ -0,0 +1 @@ +"@(#) $Id: ChangeLog,v 1.1.1.1 2007-05-02 12:34:46 c.migoni Exp $" diff --git a/Common/Errors/ClientErrors/idl/ClientErrors.xml b/Common/Errors/ClientErrors/idl/ClientErrors.xml new file mode 100644 index 000000000..8fdfb1517 --- /dev/null +++ b/Common/Errors/ClientErrors/idl/ClientErrors.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Errors/ClientErrors/src/Makefile b/Common/Errors/ClientErrors/src/Makefile new file mode 100644 index 000000000..ecd78ffa0 --- /dev/null +++ b/Common/Errors/ClientErrors/src/Makefile @@ -0,0 +1,97 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.2 2007-09-17 14:44:36 a.orlati Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 07/11/06 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +#USER_LIB = + +ACSERRDEF= ClientErrors + +ERRXMLFILE= ../idl/ClientErrors.xml + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +TMP := $(shell searchFile /tmp/tmp.txt) +ifeq ($(TMP),\#error\#) +PERM:=$(shell stat --format=%a $(ERRXMLFILE)) +else +PERM=$(shell cat /tmp/tmp.txt) +endif + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + + + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : xmlpatch_pre install_all + @chmod $(PERM) $(ERRXMLFILE) + @echo "Patch applied" + @rm -rf /tmp/tmp.txt + @echo " . . . installation done" + +xmlpatch_pre : + @echo "File permissions: " $(PERM) + @chmod a+w $(ERRXMLFILE) + @echo $(PERM) > /tmp/tmp.txt + + +#___oOo___ diff --git a/Common/Errors/ComponentErrors/idl/.cvsignore b/Common/Errors/ComponentErrors/idl/.cvsignore new file mode 100644 index 000000000..46fea6b25 --- /dev/null +++ b/Common/Errors/ComponentErrors/idl/.cvsignore @@ -0,0 +1 @@ +ComponentErrors.idl diff --git a/Common/Errors/ComponentErrors/idl/ComponentErrors.xml b/Common/Errors/ComponentErrors/idl/ComponentErrors.xml new file mode 100644 index 000000000..b1feadac7 --- /dev/null +++ b/Common/Errors/ComponentErrors/idl/ComponentErrors.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Errors/ComponentErrors/src/Makefile b/Common/Errors/ComponentErrors/src/Makefile new file mode 100644 index 000000000..c5157af7d --- /dev/null +++ b/Common/Errors/ComponentErrors/src/Makefile @@ -0,0 +1,87 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.2 2007-09-17 14:47:59 a.orlati Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 30/03/07 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +ACSERRDEF= ComponentErrors + +ERRXMLFILE= ../idl/ComponentErrors.xml + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + + + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +TMP := $(shell searchFile /tmp/tmp.txt) +ifeq ($(TMP),\#error\#) +PERM:=$(shell stat --format=%a $(ERRXMLFILE)) +else +PERM=$(shell cat /tmp/tmp.txt) +endif + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : xmlpatch_pre install_all + @chmod $(PERM) $(ERRXMLFILE) + @echo "Patch applied" + @rm -rf /tmp/tmp.txt + @echo " . . . installation done" + +xmlpatch_pre : + @echo "File permissions: " $(PERM) + @chmod a+w $(ERRXMLFILE) + @echo $(PERM) > /tmp/tmp.txt + + +#___oOo___ diff --git a/Common/Errors/Makefile b/Common/Errors/Makefile new file mode 100644 index 000000000..399685f82 --- /dev/null +++ b/Common/Errors/Makefile @@ -0,0 +1,162 @@ +#******************************************************************************* +# ALMA Project +# +# "@(#) $Id: Makefile,v 1.7 2011-06-06 14:20:00 c.migoni Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# sroberts 03/03/03 created +# +#******************************************************************************* +# This Makefile follows ACS Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# Modules in the various ACS sub-packages. +# +# The following example is for a subsystem called Voyager One +# which is composed of two directories, Alpha and Beta. + +# Alpha contains the modules alpha1, alpha2 and alpha3 +# Beta continas the moduels beta1, beta2 and beta3 +# +# Modify as appropriate to your subsystem + +SUBSYSTEM = Errors + +MODULES = ComponentErrors ClientErrors AntennaErrors BackendsErrors ParserErrors ManagementErrors MetrologyErrors ReceiversErrors MinorServoErrors + + +MAKE_FLAGS = "-k" +PLATFORM := $(shell uname) + +SHELL=/bin/bash +ECHO=echo + +ifdef MAKE_VERBOSE + AT = + OUTPUT = +else + AT = @ + OUTPUT = > /dev/null +endif +# +os = $(shell uname) +osrev = $(shell uname -r) + +ifeq ($(os),SunOS) + realtime=YES +endif + +# +# This target just forward any make target to all modules +# + + +define canned + @$(ECHO) "############ Executing '$@' on all $(SUBSYSTEM) modules #################" + @for member in $(foreach name, $(MODULES), $(name) ) ; do \ + $(ECHO) "############ $${member}" ;\ + if [ ! -d $${member} ]; then \ + echo "### ==> $${member} MODULE NOT FOUND! FAILED! " | tee -a build.log;\ + fi;\ + if [ -f $${member}/src/Makefile ]; then \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/src/ $@ || break ;\ + elif [ -f $${member}/ws/src/Makefile ]; then \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/ws/src/ $@ || break ;\ + fi;\ + if [ "$(realtime)" == "YES" ]; then \ + if [ -f $${member}/lcu/src/Makefile ]; then \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/lcu/src/ $@ || break ;\ + fi;\ + fi;\ + done +endef + +clean_log: + @$(ECHO) "############ Clean Build Log File: build.log #################" + @rm -f build.log + @touch build.log + +# +# building all modules +# +build: + @$(ECHO) "############ build $(SUBSYSTEM) Software #################"| tee -a build.log + @for member in $(foreach name, $(MODULES), $(name) ) ; do \ + if [ ! -d $${member} ]; then \ + echo "### ==> $${member} MODULE NOT FOUND! FAILED! " | tee -a build.log;\ + fi;\ + if [ -f $${member}/src/Makefile ]; then \ + $(ECHO) "############ $${member} MAIN" | tee -a build.log;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/src/ clean_dist >> build.log 2>& 1;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/src/ all >> build.log 2>& 1 || echo "### ==> FAILED all ! " | tee -a build.log; \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/src/ install >> build.log 2>& 1 || echo "### ==> FAILED install ! " | tee -a build.log; \ + continue ;\ + fi;\ + if [ -f $${member}/ws/src/Makefile ]; then \ + $(ECHO) "############ $${member} WS" | tee -a build.log;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/ws/src/ clean_dist >> build.log 2>& 1;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/ws/src/ all >> build.log 2>& 1 || echo "### ==> FAILED all ! " | tee -a build.log; \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/ws/src/ install >> build.log 2>& 1 || echo "### ==> FAILED install ! " | tee -a build.log; \ + fi;\ + if [ "$(realtime)" == "YES" ]; then \ + if [ -f $${member}/lcu/src/Makefile ]; then \ + $(ECHO) "############ $${member} LCU" | tee -a build.log;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/lcu/src/ clean_dist >> build.log 2>& 1;\ + $(MAKE) $(MAKE_FLAGS) -C $${member}/lcu/src/ all >> build.log 2>& 1 || echo "### ==> FAILED all ! " | tee -a build.log; \ + $(MAKE) $(MAKE_FLAGS) -C $${member}/lcu/src/ install >> build.log 2>& 1 || echo "### ==> FAILED install ! " | tee -a build.log; \ + fi;\ + fi;\ + done +# +# Test target +# + +.PHONY: test + +Test = test +$(Test): + @$(ECHO) "############ Clean Test Log File: test.log #################" + @rm -f test.log + @touch test.log + @$(ECHO) "############ TEST $(SUBSYSTEM) Software #################"| tee -a test.log + @for member in $(foreach name,$(MODULES),$(name)); do\ + if [ -d $${member}/ws/test ]; then\ + $(ECHO) "############ $${member}/ws/test WS TEST ############" | tee -a test.log ;\ + $(MAKE) -k -C $${member}/ws/test/ $@ | tee -a test.log | grep -E '(Nothing to|FAILED.|PASSED.|Error:)';\ + if [ -d $${member}/lcu/test ]; then\ + $(ECHO) "############ $${member}/lcu/test LCU TEST ############" | tee -a test.log;\ + $(MAKE) -k -C $${member}/lcu/test/ $@ | tee -a test.log | grep -E '(Nothing to|FAILED.|PASSED.|Error:)';\ + fi;\ + elif [ -d $${member}/test ]; then\ + $(ECHO) "############ $${member}/test MAIN TEST ############" | tee -a test.log ;\ + $(MAKE) -k -C $${member}/test/ $@ | tee -a test.log | grep -E '(Nothing to|FAILED.|PASSED.|Error:)';\ + else\ + $(ECHO) "### ==> $${member} TEST DIRECTORY STRUCTURE NOT FOUND! FAILED!" | tee -a test.log ;\ + fi;\ + done + @$(ECHO) "... done" +# +# Standard canned targets +# +clean_dist: + $(canned) +all: + $(canned) +install: + $(canned) +man: + $(canned) + +buildClean: build clean + +buildMan: build man + +# +# ___oOo___ diff --git a/Common/Errors/ManagementErrors/idl/ManagementErrors.xml b/Common/Errors/ManagementErrors/idl/ManagementErrors.xml new file mode 100644 index 000000000..813af16b2 --- /dev/null +++ b/Common/Errors/ManagementErrors/idl/ManagementErrors.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Errors/ManagementErrors/src/Makefile b/Common/Errors/ManagementErrors/src/Makefile new file mode 100644 index 000000000..c544906fb --- /dev/null +++ b/Common/Errors/ManagementErrors/src/Makefile @@ -0,0 +1,81 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.1 2008-12-24 11:28:26 a.orlati Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 22/12/08 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +ACSERRDEF= ManagementErrors + +ERRXMLFILE= ../idl/ManagementErrors.xml + + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + + +TMP := $(shell searchFile /tmp/tmp.txt) +ifeq ($(TMP),\#error\#) +PERM:=$(shell stat --format=%a $(ERRXMLFILE)) +else +PERM=$(shell cat /tmp/tmp.txt) +endif + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : xmlpatch_pre install_all + @chmod $(PERM) $(ERRXMLFILE) + @echo "Patch applied" + @rm -rf /tmp/tmp.txt + @echo " . . . installation done" + +xmlpatch_pre : + @echo "File permissions: " $(PERM) + @chmod a+w $(ERRXMLFILE) + @echo $(PERM) > /tmp/tmp.txt + + +#___oOo___ diff --git a/Common/Errors/MetrologyErrors/idl/ACSErrTypeFPGACommunication.xml b/Common/Errors/MetrologyErrors/idl/ACSErrTypeFPGACommunication.xml new file mode 100755 index 000000000..5da2dfa8e --- /dev/null +++ b/Common/Errors/MetrologyErrors/idl/ACSErrTypeFPGACommunication.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + diff --git a/Common/Errors/MetrologyErrors/idl/ACSErrTypeFPGAConnection.xml b/Common/Errors/MetrologyErrors/idl/ACSErrTypeFPGAConnection.xml new file mode 100755 index 000000000..fba4fe587 --- /dev/null +++ b/Common/Errors/MetrologyErrors/idl/ACSErrTypeFPGAConnection.xml @@ -0,0 +1,19 @@ + + + + + + + + + + diff --git a/Common/Errors/MetrologyErrors/src/Makefile b/Common/Errors/MetrologyErrors/src/Makefile new file mode 100644 index 000000000..7916c1dd7 --- /dev/null +++ b/Common/Errors/MetrologyErrors/src/Makefile @@ -0,0 +1,91 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.2 2010-09-17 16:32:51 spoppi Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# spoppi 17/09/10 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +#USER_LIB = + +MAKE_PDF = ON + +ACSERRDEF=ACSErrTypeFPGAConnection ACSErrTypeFPGACommunication + +ERRXMLFILE= ../idl/ACSErrTypeFPGACommunication.xml ../idl/ACSErrTypeFPGAConnection.xml + + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules +TMP := $(shell searchFile /tmp/tmp.txt) +ifeq ($(TMP),\#error\#) +PERM:=$(shell stat --format=%a $(ERRXMLFILE)) +else +PERM=$(shell cat /tmp/tmp.txt) +endif + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + # @chmod $(PERM) $(ERRXMLFILE) + @echo "Patch applied" + @rm -rf /tmp/tmp.txt + @echo " . . . installation done" + + + +xmlpatch_pre : + @echo "File permissions: " $(PERM) +# @chmod a+w $(ERRXMLFILE) + @echo $(PERM) > /tmp/tmp.txt + +#___oOo___ diff --git a/Common/Errors/MinorServoErrors/idl/MinorServoErrors.xml b/Common/Errors/MinorServoErrors/idl/MinorServoErrors.xml new file mode 100755 index 000000000..d55ed9a2e --- /dev/null +++ b/Common/Errors/MinorServoErrors/idl/MinorServoErrors.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Errors/MinorServoErrors/src/Makefile b/Common/Errors/MinorServoErrors/src/Makefile new file mode 100644 index 000000000..5982bac38 --- /dev/null +++ b/Common/Errors/MinorServoErrors/src/Makefile @@ -0,0 +1,80 @@ +#******************************************************************************* +# +# Makefile of Servo Errors +# +# Authors: +# Marco Buttu, mbuttu@oa-cagliari.inaf.it +# Giuseppe Maccaferri, g.maccaferri@ira.inaf.it +# +# Created: Mon Oct 12 15:04:51 CEST 2009 +# Last Modified: +# +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +MAKE_PDF = ON + +ACSERRDEF = MinorServoErrors + +ERRXMLFILE = ../idl/MinorServoErrors.xml + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +TMP := $(shell searchFile /tmp/tmp.txt) +ifeq ($(TMP),\#error\#) +PERM:=$(shell stat --format=%a $(ERRXMLFILE)) +else +PERM=$(shell cat /tmp/tmp.txt) +endif + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @chmod $(PERM) $(ERRXMLFILE) + @echo "Patch applied" + @rm -rf /tmp/tmp.txt + @echo " . . . installation done" + +xmlpatch_pre : + @echo "File permissions: " $(PERM) + @chmod a+w $(ERRXMLFILE) + @echo $(PERM) > /tmp/tmp.txt + + +#___oOo___ diff --git a/Common/Errors/ParserErrors/idl/ParserErrors.xml b/Common/Errors/ParserErrors/idl/ParserErrors.xml new file mode 100644 index 000000000..eac005172 --- /dev/null +++ b/Common/Errors/ParserErrors/idl/ParserErrors.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Errors/ParserErrors/src/Makefile b/Common/Errors/ParserErrors/src/Makefile new file mode 100644 index 000000000..0059da075 --- /dev/null +++ b/Common/Errors/ParserErrors/src/Makefile @@ -0,0 +1,79 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.1 2008-08-01 15:48:24 a.orlati Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 01/08/08 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +ACSERRDEF= ParserErrors + +ERRXMLFILE= ../idl/ParserErrors.xml + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +TMP := $(shell searchFile /tmp/tmp.txt) +ifeq ($(TMP),\#error\#) +PERM:=$(shell stat --format=%a $(ERRXMLFILE)) +else +PERM=$(shell cat /tmp/tmp.txt) +endif + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : xmlpatch_pre install_all + @chmod $(PERM) $(ERRXMLFILE) + @echo "Patch applied" + @rm -rf /tmp/tmp.txt + @echo " . . . installation done" + +xmlpatch_pre : + @echo "File permissions: " $(PERM) + @chmod a+w $(ERRXMLFILE) + @echo $(PERM) > /tmp/tmp.txt + + +#___oOo___ diff --git a/Common/Errors/ReceiversErrors/idl/DerotatorErrors.xml b/Common/Errors/ReceiversErrors/idl/DerotatorErrors.xml new file mode 100755 index 000000000..276a675a0 --- /dev/null +++ b/Common/Errors/ReceiversErrors/idl/DerotatorErrors.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Errors/ReceiversErrors/idl/ReceiversErrors.xml b/Common/Errors/ReceiversErrors/idl/ReceiversErrors.xml new file mode 100755 index 000000000..c889993a4 --- /dev/null +++ b/Common/Errors/ReceiversErrors/idl/ReceiversErrors.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Errors/ReceiversErrors/src/Makefile b/Common/Errors/ReceiversErrors/src/Makefile new file mode 100644 index 000000000..830ee2caa --- /dev/null +++ b/Common/Errors/ReceiversErrors/src/Makefile @@ -0,0 +1,73 @@ +#*********************************************************************** +# Makefile of Receivers Errors +# +# Author: +# Marco Buttu, mbuttu@oa-cagliari.inaf.it +#*********************************************************************** + +MAKE_PDF = ON + +ACSERRDEF = ReceiversErrors DerotatorErrors + +ERRXMLFILE_1 = ../idl/ReceiversErrors.xml +ERRXMLFILE_2 = ../idl/DerotatorErrors.xml + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +TMP := $(shell searchFile /tmp/tmp.txt) +ifeq ($(TMP),\#error\#) +PERM_1:=$(shell stat --format=%a $(ERRXMLFILE_1)) +PERM_2:=$(shell stat --format=%a $(ERRXMLFILE_2)) +else +PERM=$(shell cat /tmp/tmp.txt) +endif + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @chmod $(PERM_1) $(ERRXMLFILE_1) + @chmod $(PERM_2) $(ERRXMLFILE_2) + @echo "Patch applied" + @rm -rf /tmp/tmp.txt + @echo " . . . installation done" + +xmlpatch_pre : + @echo "File permissions: " $(PERM_1) $(PERM_2) + @chmod a+w $(ERRXMLFILE_1) + @chmod a+w $(ERRXMLFILE_2) + @echo $(PERM_1) > /tmp/tmp.txt + + +#___oOo___ diff --git a/Common/Errors/XBackendErrors/.cproject b/Common/Errors/XBackendErrors/.cproject new file mode 100644 index 000000000..311cce691 --- /dev/null +++ b/Common/Errors/XBackendErrors/.cproject @@ -0,0 +1,714 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Errors/XBackendErrors/.project b/Common/Errors/XBackendErrors/.project new file mode 100644 index 000000000..d31a6efb4 --- /dev/null +++ b/Common/Errors/XBackendErrors/.project @@ -0,0 +1,81 @@ + + + XBackendsErrors + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.append_environment + true + + + ?name? + + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc:/XBackendError/Debug} + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.core.cnature + + diff --git a/Common/Errors/XBackendErrors/idl/XBackendsErrors.xml b/Common/Errors/XBackendErrors/idl/XBackendsErrors.xml new file mode 100644 index 000000000..d62dad8c9 --- /dev/null +++ b/Common/Errors/XBackendErrors/idl/XBackendsErrors.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/Common/Errors/XBackendErrors/src/.idl-compilation-end b/Common/Errors/XBackendErrors/src/.idl-compilation-end new file mode 100644 index 000000000..e69de29bb diff --git a/Common/Errors/XBackendErrors/src/.idl-compilation-start b/Common/Errors/XBackendErrors/src/.idl-compilation-start new file mode 100644 index 000000000..e69de29bb diff --git a/Common/Errors/XBackendErrors/src/Makefile b/Common/Errors/XBackendErrors/src/Makefile new file mode 100644 index 000000000..79357ee6b --- /dev/null +++ b/Common/Errors/XBackendErrors/src/Makefile @@ -0,0 +1,90 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id: Makefile,v 1.1 2010/06/21 09:08:59 bliliana Exp $" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# andrea 02/10/08 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +#USER_LIB = + +MAKE_PDF = ON + +ACSERRDEF=XBackendsErrors + +ERRXMLFILE= ../idl/XBackendsErrors.xml + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +TMP := $(shell searchFile /tmp/tmp.txt) +ifeq ($(TMP),\#error\#) +PERM:=$(shell stat --format=%a $(ERRXMLFILE)) +else +PERM=$(shell cat /tmp/tmp.txt) +endif + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @chmod $(PERM) $(ERRXMLFILE) + @echo "Patch applied" + @rm -rf /tmp/tmp.txt + @echo " . . . installation done" + +xmlpatch_pre : + @echo "File permissions: " $(PERM) + @chmod a+w $(ERRXMLFILE) + @echo $(PERM) > /tmp/tmp.txt + + +#___oOo___ diff --git a/Common/Errors/dummy.txt b/Common/Errors/dummy.txt new file mode 100644 index 000000000..f4760e682 --- /dev/null +++ b/Common/Errors/dummy.txt @@ -0,0 +1 @@ +ACS4SRT diff --git a/Common/Errors/errortypes.txt b/Common/Errors/errortypes.txt new file mode 100644 index 000000000..8a77d1c99 --- /dev/null +++ b/Common/Errors/errortypes.txt @@ -0,0 +1,10 @@ +#Code Name +2001 ComponentErrors +2002 AntennaErrors +2003 ASErrors +2004 ParserErrors +2005 BackendsErrors +2006 ManagementErrors +2007 MinorServoErrors +2101 ClientErrors + diff --git a/Common/Interfaces/ActiveSurfaceInterface/config/CDB/schemas/ActiveSurface.xsd b/Common/Interfaces/ActiveSurfaceInterface/config/CDB/schemas/ActiveSurface.xsd new file mode 100644 index 000000000..418462255 --- /dev/null +++ b/Common/Interfaces/ActiveSurfaceInterface/config/CDB/schemas/ActiveSurface.xsd @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Interfaces/ActiveSurfaceInterface/idl/ActiveSurfaceBoss.idl b/Common/Interfaces/ActiveSurfaceInterface/idl/ActiveSurfaceBoss.idl new file mode 100644 index 000000000..68052b348 --- /dev/null +++ b/Common/Interfaces/ActiveSurfaceInterface/idl/ActiveSurfaceBoss.idl @@ -0,0 +1,44 @@ +/* *******************************************************************/ +/* OAC Osservatorio Astronomico di Cagliari */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when what */ +/* Carlo Migoni (migoni@oa-cagliari.inaf.it) 10/07/2013 Creation */ +/*********************************************************************/ + +#ifndef _ACTIVESURFACEBOSS_IDL_ + +#define _ACTIVESURFACEBOSS_IDL_ + +#include +#include + +#pragma prefix "alma" + +module ActiveSurface { + + /** + * This component is the supervisor of the Active Surface subsystem. + * It will be used to control the entire active surface during an observation. + * @author Carlo Migoni, + * Osservatorio Astronomico di Cagliari, Italia + *
+ */ + interface ActiveSurfaceBoss: ACS::CharacteristicComponent, Management::CommandInterpreter, Management::Subsystem { + + /** + * This method can be called in order to disable the activesurface refresh. + * @throw CORBA::SystemException + */ + void asOff(); + + /** + * This method can be called in order to enable the active surface refresh. + * @throw CORBA::SystemException + */ + void asOn(); + }; +}; + +#endif diff --git a/Common/Interfaces/ActiveSurfaceInterface/src/Makefile b/Common/Interfaces/ActiveSurfaceInterface/src/Makefile new file mode 100644 index 000000000..73f6e4a25 --- /dev/null +++ b/Common/Interfaces/ActiveSurfaceInterface/src/Makefile @@ -0,0 +1,207 @@ +#******************************************************************************* +# PPPPPPPP +# +# "@(#) $Id$" +# +# Makefile of ........ +# +# who when what +# -------- -------- ---------------------------------------------- +# cmigoni 10/07/13 created +# + +#******************************************************************************* +# This Makefile follows VLT Standards (see Makefile(5) for more). +#******************************************************************************* +# REMARKS +# None +#------------------------------------------------------------------------ + +# +# user definable C-compilation flags +#USER_CFLAGS = + +# +# additional include and library search paths +#USER_INC = +#USER_LIB = + +# +# MODULE CODE DESCRIPTION: +# ------------------------ +# As a general rule: public file are "cleaned" and "installed" +# local (_L) are not "installed". + +# +# C programs (public and local) +# ----------------------------- +EXECUTABLES = +EXECUTABLES_L = + +# +# +xxxxx_OBJECTS = +xxxxx_LDFLAGS = +xxxxx_LIBS = + +# +# special compilation flags for single c sources +#yyyyy_CFLAGS = + +# +# Includes (.h) files (public only) +# --------------------------------- +INCLUDES = + +# +# Libraries (public and local) +# ---------------------------- +LIBRARIES = +LIBRARIES_L = + +# +# +lllll_OBJECTS = + +# +# Scripts (public and local) +# ---------------------------- +SCRIPTS = +SCRIPTS_L = + +# +# TCL scripts (public and local) +# ------------------------------ +TCL_SCRIPTS = +TCL_SCRIPTS_L = + +# +# Python stuff (public and local) +# ---------------------------- +PY_SCRIPTS = +PY_SCRIPTS_L = + +PY_MODULES = +PY_MODULES_L = + +PY_PACKAGES = +PY_PACKAGES_L = +pppppp_MODULES = + +# +# +tttttt_OBJECTS = +tttttt_TCLSH = +tttttt_LIBS = + +# +# TCL libraries (public and local) +# ------------------------------ +TCL_LIBRARIES = +TCL_LIBRARIES_L = + +# +# +tttlll_OBJECTS = + +# +# Configuration Database Files +# ---------------------------- +CDB_SCHEMAS = ActiveSurface + +# +# IDL Files and flags +# +IDL_FILES = ActiveSurfaceBoss +TAO_IDLFLAGS = +USER_IDL = +# +# Jarfiles and their directories +# +JARFILES= +jjj_DIRS= +jjj_EXTRAS= +# +# java sources in Jarfile on/off +DEBUG= +# +# ACS XmlIdl generation on/off +# +XML_IDL= +# +# Java Component Helper Classes generation on/off +# +COMPONENT_HELPERS= +# +# Java Entity Classes generation on/off +# +XSDBIND= +# +# Schema Config files for the above +# +XSDBIND_INCLUDE= +# man pages to be done +# -------------------- +MANSECTIONS = +MAN1 = +MAN3 = +MAN5 = +MAN7 = +MAN8 = + +# +# local man pages +# --------------- +MANl = + +# +# ASCII file to be converted into Framemaker-MIF +# -------------------- +ASCII_TO_MIF = + +# +# other files to be installed +#---------------------------- +INSTALL_FILES = + +# +# list of all possible C-sources (used to create automatic dependencies) +# ------------------------------ +CSOURCENAMES = \ + $(foreach exe, $(EXECUTABLES) $(EXECUTABLES_L), $($(exe)_OBJECTS)) \ + $(foreach rtos, $(RTAI_MODULES) , $($(rtos)_OBJECTS)) \ + $(foreach lib, $(LIBRARIES) $(LIBRARIES_L), $($(lib)_OBJECTS)) + +# +#>>>>> END OF standard rules + +# +# INCLUDE STANDARDS +# ----------------- + +MAKEDIRTMP := $(shell searchFile include/acsMakefile) +ifneq ($(MAKEDIRTMP),\#error\#) + MAKEDIR := $(MAKEDIRTMP)/include + include $(MAKEDIR)/acsMakefile +endif + +# +# TARGETS +# ------- +all: do_all + @echo " . . . 'all' done" + +clean : clean_all + @echo " . . . clean done" + +clean_dist : clean_all clean_dist_all + @echo " . . . clean_dist done" + +man : do_man + @echo " . . . man page(s) done" + +install : install_all + @echo " . . . installation done" + + +#___oOo___ diff --git a/Common/Interfaces/AntennaInterface/config/CDB/schemas/Mount.xsd b/Common/Interfaces/AntennaInterface/config/CDB/schemas/Mount.xsd new file mode 100644 index 000000000..8b631d12a --- /dev/null +++ b/Common/Interfaces/AntennaInterface/config/CDB/schemas/Mount.xsd @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Interfaces/AntennaInterface/config/CDB/schemas/PointingModel.xsd b/Common/Interfaces/AntennaInterface/config/CDB/schemas/PointingModel.xsd new file mode 100644 index 000000000..a1d9c672c --- /dev/null +++ b/Common/Interfaces/AntennaInterface/config/CDB/schemas/PointingModel.xsd @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Common/Interfaces/AntennaInterface/config/CDB/schemas/Station.xsd b/Common/Interfaces/AntennaInterface/config/CDB/schemas/Station.xsd new file mode 100644 index 000000000..97741a9e7 --- /dev/null +++ b/Common/Interfaces/AntennaInterface/config/CDB/schemas/Station.xsd @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Common/Interfaces/AntennaInterface/config/doxyfile b/Common/Interfaces/AntennaInterface/config/doxyfile new file mode 100644 index 000000000..95808ca0c --- /dev/null +++ b/Common/Interfaces/AntennaInterface/config/doxyfile @@ -0,0 +1,2 @@ +FILE_PATTERNS = *.idl *.midl +EXCLUDE_PATTERNS = */CVS/* diff --git a/Common/Interfaces/AntennaInterface/idl/AntennaBoss.midl b/Common/Interfaces/AntennaInterface/idl/AntennaBoss.midl new file mode 100644 index 000000000..62c23cf1e --- /dev/null +++ b/Common/Interfaces/AntennaInterface/idl/AntennaBoss.midl @@ -0,0 +1,671 @@ +/* *********************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when what */ +/* Andrea Orlati(aorlati@ira.inaf.it) 20/11/2007 Creation */ +/* Andrea Orlati(aorlati@ira.inaf.it) 28/12/2008 Added the method checkSlewing */ +/* Andrea Orlati(aorlati@ira.inaf.it) 06/04/2010 checkSlewing replaced by checkScan, starTracking removed and mapped into startScan */ +/* Andrea Orlati(aorlati@ira.inaf.it) 09/04/2010 added the wrappers track(),moon(),elevationScan() and azimuthScan() */ +/* Andrea Orlati(aorlati@ira.inaf.it) 06/09/2010 reviewed the signature of the getObservedequtorial() and getObservedHorizontal() in order to provide integration */ +/* Andrea Orlati(aorlati@ira.inaf.it) 10/05/2011 subsystem now capable to perform scan starting from a previous scan (secondary) as central point, startScan() and checkScan() changed accordingly */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 10/10/2011 Added attribute targetFlux, that reports the expected source flux */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 15/02/2012 added getApparentCoordinates() method */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 22/02/2013 the check slewing method also check the target against limits given by the caller*/ +/* Andrea Orlati(a.orlati@ira.inaf.it) 08/04/2013 added methods goTo() and skydipScan(). The tracking parameter structure has a new field that allows to control the pointing corrections during the scan*/ +/* Andrea Orlati(a.orlati@ira.inaf.it) 12/06/2014 method radial velocity to support for spectroscopy */ + +#ifndef _ANTENNABOSS_IDL_ + +#define _ANTENNABOSS_IDL_ + +#include +#include +#include +#include +#include +#include "AntennaDefinitions.idl" +#include "EphemGenerator.idl" + +#pragma prefix "alma" + +module Antenna { + /** + * This structure holds all the parameters required to initialize the subScan (OTF) component. + * It is passed as argument to the startScan() routine. All coordinates are given in radians and are referred to + * the coordFrame. If the equatorial frame is selected it is supposed to be J2000. + * @sa OTF interface. + */ + typedef struct SubScanSetup { + double lon1; + double lat1; + double lon2; + double lat2; + Antenna::TCoordinateFrame coordFrame; + Antenna::TsubScanGeometry geometry; + Antenna::TCoordinateFrame subScanFrame; + Antenna::TsubScanDescription description; + Antenna::TsubScanDirection direction; + ACS::TimeInterval subScanDuration; + } TSubScanParameters; + + /** + * It defines the dimension of the tracking parameter vector + */ + const long ANTENNA_TRACKING_PARAMETER_NUMBER=10; + + /** + * This structure is used to pass the tracking parameters to the startTracking() routine. The coordinates are supposed to be in radians + * and their meaning varies according to the TGeneratorType and TCoordinateFrame. + */ + typedef struct TrackPoint { + /** + * If significant this is the name or identifier of the target + */ + string targetName; + /** + * this field specifies the type of the generator, in particular it defines if a sidereal motion must be used in order to track the source or + * another kind of motion should be used. (@sa TGeneratorType) + */ + TGeneratorType type; + /** + * this vector is the list of parameters that defines the source, The parameters enlisted here must be radians. For Example: + * 1) frame=ANT_EQUATORIAL, type=ANT_SIDEREAL (@sa SkySource::setSourceFromEquatorial(): + * @arg \c 0 the right ascension of the source in radians + * @arg \c 1 the declination of the source in radians + * @arg \c 2 proper motion in right ascension in mas/year (milli seconds of arc year (tropical) if FK4 is used, per + * year (julian) if Fk5 is used). dRA/dt*cos(DEC) is assumed + * @arg \c 3 proper motion in declination in mas/year (milli seconds of arc per year (tropical) if FK4 is used, + * per year (julian) if Fk5 is used) + * @arg \c 4 parallax in milli arcseconds. + * @arg \c 5 rvel radial velocity in Km/sec ( positive value means the source is moving away), reference frame is supposed to be BARYCENTRE and definition is OPTICAL + */ + double parameters[ANTENNA_TRACKING_PARAMETER_NUMBER]; + /** + * indicates how many significant parameters are stored in the parameters array. + */ + long paramNumber; + /** + * it represents the frame the passed parameters/coordinates refers to. + */ + TCoordinateFrame frame; + /** + * This field indicates the equinox of the equatorial coordinates, if other frames are used it is ignored. (@saTSystemEquinox) + */ + TSystemEquinox equinox; + /** + * longitude offset in radians. + */ + double longitudeOffset; + /** + * latitude offset in radians + */ + double latitudeOffset; + /** + * coordinate frame of the offset + */ + TCoordinateFrame offsetFrame; + /** + * Radial velocity reference frame + */ + TReferenceFrame VradFrame; + /** + * Radial velocity definition + */ + TVradDefinition VradDefinition; + /** + * radial velocity, Km/s id definition is not redshift + */ + double RadialVelocity; + /** + * offsets have been provided or not. If provided they will replace the one given manually for the frame. + */ + boolean applyOffsets; + /** + * Parameters in case the generator is a OTF + */ + TSubScanParameters otf; + /** + * Reports the preferred azimuth section + */ + TSections section; + /** + * if true the track point will be joint with another track point in order to obtain a combination of both + */ + boolean secondary; + /** + * enable/disable the pointing corrections....refraction, pointign model. Just for the current scan. + */ + boolean enableCorrection; + } TTrackingParameters; + + /** + * This is a notification channel name, it publishes information about the antenna subsystem that can be used to other + * subsystems. Boss will be the data producer for this channel. Anyone interested in these information must register + * to this channel as a consumer. Data will be published on this channel when one of the members of the + * AntennaDataBlock structure changes its value or when at least 1 second elapsed since last publication. + * In case of errors and one second elapsed since last publication, the last known good data is published until the error + * is fixed. + */ + const string ANTENNA_DATA_CHANNEL="AntennaData"; + + /** + * Notification channel data structure. The boss informs all registered consumers when one of these members change + * its status or value (not including time). In any case data are published at least once a second. In case there are problems + * retrieving the information or other, the last available data are published until the problem is fixed. + * Time represents the number of 100 ns since 1582-10-15 00:00:00, it is defined in baci.idl and it is mapped over a + * longlong type. + */ + struct AntennaDataBlock { + ACS::Time timeMark; /*!< this is the absolute time mark that reportes exactly when the publised events occurred */ + boolean tracking; /*!< true when the antenna is tracking the commanded trajectory */ + Management::TSystemStatus status; /*!< this report the subsystem status. @sa the attribute status */ + }; + + /** + * This component is the supervisor of the Antenna subsystem. Its first duty is to monitor all the subsystem to check if potential problems are + * imminent. It is also the entry point that must be used in order to start any observation that involves the antenna movement. + * Due to the network latency and due to the way we use to command the mount (loading a certain ammount of the tracking curve in advance) + * all the coordinates exposed by this component are stored in buffers, each of them labelled with its time mark. As a result of this any + * coordinate request must be issued together with a timestamp. The returned coordinates come from the linear interpolation of the stored + * points versus time. The coordinate returned by the component attributes are computed using the current time as timestamp. + * @todo add comments about the component. Can be get from the "Antenna Notes Document". + * @ todo add the description of the syntax of the human readable commands, once defined + * add a description to every property of the interface, included the units + * fill in the description field in the .xml file inside the implementation module. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia + *
+ */ + interface AntennaBoss: ACS::CharacteristicComponent, Management::CommandInterpreter, Management::Subsystem { + /** + * This attribute reports the name or the identifier of the current target + */ + readonly attribute ACS::ROstring target; + /** + * This attribute reports the right ascension (radians) of the currently tracked target. This coordinate refers to J2000 epoch. + */ + readonly attribute ACS::ROdouble targetRightAscension; + /** + * This attribute reports the declination (radians) of the currently tracked target. This coordinate refers to J2000 epoch. + */ + readonly attribute ACS::ROdouble targetDeclination; + /** + * This attribute reports about the radial velocity of the target, given in Km/s. + */ + readonly attribute ACS::ROdouble targetVrad; + /** + * This attribute reports the expected flux (Jy) of the current target, if not known 0.0 is reported + */ + readonly attribute ACS::ROdouble targetFlux; + /** + * This attribute reports which is the reference frame of radial velocity of the target + */ + readonly attribute Antenna::ROTReferenceFrame vradReferenceFrame; + /** + * This attribute reports which is the definition of radial velocity of the target + */ + readonly attribute Antenna::ROTVradDefinition vradDefinition; + /** + * This attribute reports the present user sky offset(radians) commanded for the azimuth. Offset can be reset by calling setup or esplicitly by calling the + * setHorizontalOffsets() method. The offset can be laso changed by the startScan() method. + */ + readonly attribute ACS::ROdouble azimuthOffset; + /** + * This attribute reports the present user offset(radians) commanded for the elevation. + */ + readonly attribute ACS::ROdouble elevationOffset; + /** + * This attribute reports the present user sky offset(radians) commanded for the rightAscension. + */ + readonly attribute ACS::ROdouble rightAscensionOffset; + /** + * This attribute reports the present user offset(radians) commanded for the declination. + */ + readonly attribute ACS::ROdouble declinationOffset; + /** + * This attribute reports the present user sky offset(radians) commanded for the galactic longitude. + */ + readonly attribute ACS::ROdouble longitudeOffset; + /** + * This attribute reports the present user offset(radians) commanded for the galactic latitude. + */ + readonly attribute ACS::ROdouble latitudeOffset; + /** + * This attribute reports the raw azimuth in radians. Raw coordinates are coordinates with all the correction required as + * the pointing model or refraction. The coordinate reported here refers to the current time. + */ + readonly attribute ACS::ROdouble rawAzimuth; + /** + * This attribute reports the raw elevation in radians. Raw coordinates are coordinates with all the correction required as + * the pointing model or refraction. The coordinate reported here refers to the current time. + */ + readonly attribute ACS::ROdouble rawElevation; + /** + * This attribute reports the observed azimuth in radians. Observed coordinates comes from the encoders coordinates (@sa component moust) + * depurated by instrumental effects like the the pointing model or refraction. The coordinate reported here refers to the current time. + */ + readonly attribute ACS::ROdouble observedAzimuth; + /** + * This attribute reports the observed elevation in radians. Observed coordinates comes from the encoders coordinates (@sa component moust) + * depurated by instrumental effects like the the pointing model or refraction. The coordinate reported here refers to the current time. + */ + readonly attribute ACS::ROdouble observedElevation; + /** + * This attribute reports the observed right ascension in radians. This coordinates come directly from the conversion of horizontal observed + * coordinates. They are referred to J2000 equinox. The coordinate reported here refers to the current time. + */ + readonly attribute ACS::ROdouble observedRightAscension; + /** + * This attribute reports the observed declination in radians. This coordinates come directly from the conversion of horizontal observed + * coordinates. They are referred to J2000 equinox. The coordinate reported here refers to the current time. + */ + readonly attribute ACS::ROdouble observedDeclination; + /** + * This attribute reports the observed galactic longitude in radians. This coordinates come directly from the conversion of equatorial observed + * coordinates.The coordinate reported here refers to the current time. + */ + readonly attribute ACS::ROdouble observedGalLongitude; + /** + * This attribute reports the observed galactic latitude in radians. This coordinates come directly from the conversion of euqtorial observed + * coordinates.The coordinate reported here refers to the current time. + */ + readonly attribute ACS::ROdouble observedGalLatitude; + + /** + * This attribute shows if the AntennaBoss component is enabled or not. Since this component is the subsystem leader and entry point, + * enabling or disabling this component corresponds to enabling or disabling the large part of the functionality of the Antenna subsystem. + * For example if not enable the component will not forwords any commands to the mount. + */ + readonly attribute Management::ROTBoolean enabled; + + /** + * This attribute shows the correction for refraction and pointing model is on or off. If true (feature is on) when the + * component is loading a new position into the telescope will use the offsets coming from the PoinintgModel + * and Refraction components. If false (feature is off) the raw coordinates commanded to the mount are identical + * to the apparent ones. + */ + readonly attribute Management::ROTBoolean correctionEnabled; + + /** + * This attribute reports the ephemeris generator that will be used to command the coordinates to the mount + */ + readonly attribute ROTGeneratorType generatorType; + + /** + * @copybrief Management::status + * This attribute is a general flag that shows if the subsytem led by this component is ok or some problems + * happened. If the corresponding mountStatus flag of the Mount interface is not MNG_OK + * this attributes reports the same value; otherwise it reports the internal staus of the boss. The boss status can be + * altered by many situation, for example if an exception is found the MNG_WARNING is adopted. The internal + * status will be valid for 3 seconds then, if not renewed, it will be considered cleared. The boss status is not changed + * to a lower level if the present status is not cleared. If the the attribute enabled is false or the attribute HPBW + * is not set, the status is always MNG_WARNING. + * The meaning of the variuos status is the following: + * @arg \c MNG_OK no errors everything is ok. + * @arg \c MNG_WARNING a possible problem has been found, the obervation can continue but it would be better + * to investigate the problem. + * @arg \c MNG_FAILURE a hard problem encoutered, the observation cannot be carried on. + */ + + /** + * This attribute reports the currently used Full Width Half Maximum in radians. This value is used to check wether the + * telescope is tracking or not (@sa AntennaDataBlock). After component creation this value is zero, that means + * the boss component will remain in the MNG_WARNING status until a new value is provided directly (setFWHM()) or indirectly + * (computeFWHM()) + * (@sa setFWHM). + */ + readonly attribute ACS::ROdouble FWHM; + + /** + * This attribute reports the currently used wave length in meters. After component creation this value is zero, that means + * the boss component will remain in the MNG_WARNING status until a new value is provided directly (setFWHM()) or indirectly (computeFWHM()) + * (@sa setFWHM). + */ + readonly attribute ACS::ROdouble waveLength; + + /** + * This attribute reports the current azimuth offsets applied due to pointing model (in radians) + */ + readonly attribute ACS::ROdouble pointingAzimuthCorrection; + + /** + * This attribute reports the current elevation offsets applied due to pointing model (in radians) + */ + readonly attribute ACS::ROdouble pointingElevationCorrection; + + /** + * Rhis attribute reports the current correction to be applied to the elevation due to refraction (in radians) + */ + readonly attribute ACS::ROdouble refractionCorrection; + + /** + * @copybrief Management::setup() + * This method must be called in order to configure the mount and prepare tha antenna for the observation. It will unstow the antenna and + * it will configure the proper working mode for the mount axis. Finally it will synchronizes the Antenna time with the host computer + * system time. It resets the user offsets. + * @param config code of the required configuration + * @throw CORBA::SystemExcpetion + * @throw ManagementErrors::ConfigurationErrorsEx + * @arg \c ComponentErrors::CORBAProblemEx + * @arg \c ComponentErrors::CouldntCallOperationEx + * @arg \c ComponentErrors::UnexpectedEx + */ + + /** + * @copybrief Management::park() + * This method immediately sends the antenna to stow. + * @throw CORBA::SystemExcpetion + * @throw ManagementErrors::ParkingErrorEx + * @arg \c ComponentErrors::CORBAProblemEx + * @arg \c ComponentErrors::CouldntCallOperationEx + * @arg \c ComponentErrors::UnexpectedEx + */ + + /** + * This method immediately stops the tracking. In particular it stops the mount and the thread that is in charge of loading the tracking trajectory. + * It also releases the ephemeris generator component. Since this operation will leave the mount axis in ACU_STOP mode, in order to + * restart tracking the method setup() should be called again. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @arg \c ComponentErrors::UnexpectedEx + * @arg \c ComponentErrors::CouldntCallOperationEx + * @arg \c ComponentErrors::CORBAProblemEx + * @arg \c ComponentErrors::CouldntReleaseComponentEx + */ + void stop() raises (ComponentErrors::ComponentErrorsEx); + + /** + * This method must be used to start a scan on a target. This target can be a normal radiosource (so that it can be tracked via + * a sidereal pattern) or a Solar System Body or an artifical probe or it could be a On The Fly scan. The mode PROGRMATRACK must already be configured + * in the mount. + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw AntennaErrors::AntennaErrorsEx + * @param startUT the exact time the scan is supposed to start, if negative or zero it must be started as soon as possible. In that case the argument could return back the computed + * effective start UT time (i.e in case of OTF scan). + * @param parameters this stucture is the list of all parameters that are required by Boss to define the sub scan. The caller + * is responsible for the management of the structure. + * @param secondary this stucture is identical to the previous one, in most cases it is ignored, only on particular cases it is used as a secondary trajectory generator. For example + * if the primary parameters define an OTF scan the secondary could be used to determine the center of the scan. The caller + * is responsible for the management of the structure. + */ + void startScan(inout ACS::Time startUT,in TTrackingParameters parameters,in TTrackingParameters secondary) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method virtually stops the current scan. The antenna boss indeed is not required to do anything. + * @param timeToStop stores the expected epoch in which the scan will be stopped (closed) + * @throw ComponentErrors::ComponentErrorsEx + * @throw AntennaErrors::AntennaErrorsEx + */ + void closeScan(out ACS::Time timeToStop) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + + /** + * This is a wrapper of the startScan() function. It allows to immediately start a skydip from the prsent azimuth position. + * @param el1 sets the first edge of the elevation range, a negative means take the default value + * @param el2 sets the second edge of the elevation range, a negative means take the default value + * @param duration allows to select how much time the scan will take to complete + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw AntennaErrors::AntennaErrorsEx + */ + //ACS::Time skydipScan(in double el1,in double el2,in ACS::TimeInterval duration) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /* + * This is a wrapper of the startScan() function. It allows to immediately go off source along a given frame. + * The offset is always done along longitude a part from a particular case. + * If the frame is horizontal and the current elevation is over the cut off threshold the movement is not done in azimuth but in elevation. + * A source or a target must already be commanded. + * @param beams this is the number of beams applied as offset. + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw AntennaErrors::AntennaErrorsEx + */ + void goOff(in Antenna::TCoordinateFrame frame,in double beams) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method is only be used internally. Anyone that needs to know if the telescope + * could perform a given scan before a given time, can call this. The computation is performed using the current position as starting position. The target position could be given + * in any of the supported frames. + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw AntennaErrors::AntennaErrorsEx + * @param startUt this is the time before which the telescope is supposed to reach the target, if zero the scan is checked only against the elevation. + * @param parameters structure that describes the scan to be performed. + * @param secondary this structure is identical to the previous one, in most cases it is ignored, only on particular cases it is used as a secondary trajectory generator in order to get + * a combination of both of them. + * @param lowerElLimit defines the lower limit in elevation to be checked: the target must lay beyond that limit (radians). A negative value forces the check against default value + * @param runTime structure used to return some of the run time information about the scan (it must be freed by caller). + * @arg \c targetName name of the current target + * @arg \c azimuth initial azimuth of the current scan + * @arg \c elevation initial elevation of the current scan + * @arg \c startEpoch starting ut time of the current scan (if startUT!=0 it is always equal to startUT, otherwise it is computed in all scan cases) + * @arg \c slewingTime expected slewing time to the starting point + * @arg \c section indicates where in the azimuth range the scan will start + * @arg \c axis scanning axis of the current scan + * @return true if the telescope will be in the target position before the given epoch expires, false if the + * telescope will not be able to get there in time ( now+SlewTime>ut). + */ + boolean checkScan(in ACS::Time startUt,in TTrackingParameters parameters,in TTrackingParameters secondary,in double lowerElLimit,in double upperElLimit, + out TRunTimeParameters runTime) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * Reset the failures of the subsystem. + * @throw CORBA::SystemExcpetion + * @throw ComponentErrors::ComponentErrorsEx + * @throw AntennaErrors::AntennaErrorsEx + */ + void reset() raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method can be called in order to disable the component. That means that the antenna subsystem cannot be commanded any more via the + * boss. The functionality of single component is not affected at all. By default the boss component comes up enabled. If the component is enabled + * or not, is reported by the property enable. + * @throw CORBA::SystemException + */ + void disable(); + + /** + * This method can be called in order to enable the component. That means restore all the functionalities of the Antenna subsystem. + * By default the boss component comes up enabled. If the component is enabled or not, is reported by the property enable. + * @throw CORBA::SystemException + */ + void enable(); + + /** + * This method will turn on the correctionEnabled. + * @throw CORBA::SystemException + */ + void correctionEnable(); + + /** + * This method will turn off the correctionEnabled. + * @throw CORBA::SystemException + */ + void correctionDisable(); + + /** + * This action is the setter method for the attribute FWHM. It should be called by the component responsable of + * configuring the recevier before the observation. + * @throw CORBA::SystemException + * @param value new value for the Full Width Half Maximum in radians. + * @param waveLen the wave length (meters) that correspond to the passed FWHM + */ + void setFWHM(in double value,in double waveLen); + + /** + * This action sets the FWHM attribute as a result of the beam width computation. + * @throw CORBA::SystemException + * @param taper taper value of the current receiver (db) + * @param waveLength wave length of the sky frequency (meters) + */ + void computeFWHM(in double taper,in double waveLength); + + /** + * This function may be used to extimate the source flux of the current source at any given frequency. In order for this function + * to return valid extimation a FWHM should be known. Also the current target or ephem generator should allow for this computation. + * In case the flux could not be computed a 0.0 is returned. + * @param freq list of frequencies (MHz) we want to know the expected flux + * @param fluxes list of th ecorresponding fluxes + */ + void getFluxes(in ACS::doubleSeq freqs,out ACS::doubleSeq fluxes); + + /** + * This action allows to force a particular vlsr for the current target. The current target vlsr could be read from property targetVlsr and it is usually set + * when the startScan is issued. For example if the user asked to track a catalog source the vlsr is normally set from the catalog data. When this information could not + * be retrived the property is left null so this methos allows to force a proper value. + * @throw CORBA::SystemException + * @param value new vlsr for the current target (Km/s) + */ + //void setVlsr(in double value); + + /** + * This action allows to set the radial velocity corresponding to the current target, If the radial velocity was already given (by catalog for exaple), this command will override the current value. + * @param rval radial velocity (Km/sec) if the velocity definition is not Redshift (Z) + * @param vref reference frame of the velocity + * @param vdef velocity definition + * @throw CORBA::SystemException + */ + void radialVelocity(in double rval, in TReferenceFrame vref, in TVradDefinition vdef); + + /** + * This call will computes the topocentric velocity of the current source with respect to the observer. The source radial velocity, + * frame and definition must be known (@sa radialVelocity()). The computation is executed for each of the input rest frequencies. + * @param restFreq reference frequency (MHz) + * @param topo topocentric velocities (km/sec) corresponding to the input frequency + * @throw CORBA::SystemException + * @throw AntennaErrors::AntennaErrorsEx + * @throw ComponentErrors::ComponentErrorsEx + */ + void getTopocentricFrequency(in ACS::doubleSeq restFreq,out ACS::doubleSeq topo) raises (ComponentErrors::ComponentErrorsEx, + AntennaErrors::AntennaErrorsEx); + + /** + * copybrief Management::CommandInterpreter::command + * This is the command line interpreter for the sub-system. All the attributes and all the methods exposed by the boss can be + * called. That means a full set of operation for standard observation, but not full control of the system. + * @param the string that contains the command line to be parsed + * @return the string that contains the answer to the command issued by the input parameter. The caller is responsible to + * free the returned string (@sa CORBA::string_free). + */ + + /** + * This method is used to add user offset to the current pointing of the antenna. The offset will be added in the given frame. + * A call to startScan could overwrite the offset given by this command. In case a new tracking is started (either changing the generator or not) the offsets are not reset. + * An offset given for a frame will also cause the offsets relatve to other frames to be cleared. + * Depending on the particular generator the offsets could be ignored. In taht case ar error is thrown. The longitude is sky offset so it will be corrected for the cosine of latitude. + * The values can be read back from the azimuthOffset , elevationOffset, rightAscensionOffset, declinationOffset, longitudeOffset and latitudeOffset + * attributes accordingly. + * @throw CORBA::SystemException + * @throw AntennaErrors::AntennaErrorsEx + * @throw ComponentErrors::ComponentErrorsEx + * @arg \c ComponentErrors::UnexpectedEx + * @arg \c ComponentErrors::CORBAProblemEx + * @param lonOff new offset to be added to the azimuth (radians) + * @param latOff new offset to be added to the elevation (radians) + * @param frame frame the offesets refer to + */ + void setOffsets(in double lonOff,in double latOff,in TCoordinateFrame frame) raises (ComponentErrors::ComponentErrorsEx, + AntennaErrors::AntennaErrorsEx); + + /** + * This method can be used by clients in order to get a reference to the generator currently in use within the boss. + * @throw CORBA::SystemException + * @param type returns the type of the generator. + * @return the CURL of the currently active ephem generator. If the string is empty, now generator is currently used. T + * he caller is in charge of deallocating the returned string. + */ + string getGeneratorCURL(out TGeneratorType type); + + /** + * This method should only be used internally to know the raw coordinates commanded to the mount. You must provide the timemark + * your coordinates have to refer to. + * @throw CORBA::SyStemException + * @param time this indicates to the routine the time to which the coordinates refer + * @param az the raw azimuth in radians + * @param el the raw elevation in radians + */ + void getRawCoordinates(in ACS::Time time,out double az,out double el); + + /** + * This method should only be used internally to know the apparent coordinates commanded. You must provide the timemark + * your coordinates have to refer to. Apparent coordinates are included with user offsets and come directly fro ephemeris generator. They should differ from observed coordinate just for pointing errors. + * @throw CORBA::SyStemException + * @param time this indicates the time the coordinates refer to + * @param az the apparent azimuth in radians + * @param el the apparent elevation in radians + * @param ra apparent right ascension in radinas + * @param dec apparent declination in radians + * @param jepoch julian epoch the equtorial coordinates refer to + * @param lon galactic longitude corresponding to the apparent equatorial + * @param lat galactic latitude corresponding to the apparent equatorial + */ + void getApparentCoordinates(in ACS::Time time,out double az,out double el, out double ra,out double dec,out double jepoch,out double lon,out double lat); + + /** + * This method should only be used internally to know the observed equatorial coordinates. A timestamp to which the coordinates + * referes to must be provided. It is highly probable that these cordinates are not "real" (directly read from the antenna) but they are the result of + * an interpolation. The equinox is J2000. They directly come from the observed in the horizontal frame. + * In case duration is greter than the configured coordinate integration time, the returned coordinates are the result of the average over the duration interval that starts + * from time. + * @throw CORBA::SystemExcpetion + * @param time the input timestamp + * @param duration duration of the integration, if greater than coordinate integration time the returned values are not instantaneous but are averaged + * over the provided interval. + * @param ra the returned observed right ascension in radians + * @param dec the returned observed declination in radians + */ + void getObservedEquatorial(in ACS::Time time,in ACS::TimeInterval duration,out double ra,out double dec); + + /** + * This method should only be used internally to know the observed galactic coordinates. A timestamp to which the coordinates + * referes to must be provided. It is highly probable that these cordinates are not "real" (directly read from the antenna) but they are the result of + * an interpolation. They are obtained by converting the corresponding J2000 observed equatorial coordinates. + * @throw CORBA::SystemExcpetion + * @param time the input timestamp + * @param duration duration of the integration, if greater than coordinate integration time the returned values are not instantaneous but are averaged + * over the provided interval. + * @param ra the returned observed galactic longitude in radians + * @param dec the returned observed galactic latitude in radians + */ + void getObservedGalactic(in ACS::Time time,in ACS::TimeInterval duration, out double longitude,out double latitude); + + /** + * This method should only be used internally to know the observed horizontal coordinates. A timestamp to which the coordinates + * referes to must be provided. It is highly probable that these cordinates are not "real" (directly read from the antenna) but they are the result of + * an interpolation. They are obtained by the encoders coordinates depurated by instrumental effects.. + * @throw CORBA::SystemExcpetion + * @param time the input timestamp + * @param duration duration of the integration, if greater than coordinate integration time the returned values are not instantaneous but are averaged + * over the provided interval. + * @param ra the returned observed azimuth in radians + * @param dec the returned observed elevation in radians + */ + void getObservedHorizontal(in ACS::Time time,in ACS::TimeInterval duration,out double az,out double el); + + /** + * This method should only be used internally to know the user offsets currently commanded + * @throw CORBA::SystemExcpetion + * @param azOff user offset for the azimuth (radians) + * @param elOff user offset for the elevation (radians) + * @param raOff user offset for the right ascension (radians) + * @param decOff user offset for the declination (radians) + * @param lonOff user offset for the longitude (radians) + * @param latOff user offset for the latitude (radians) + */ + void getAllOffsets(out double azOff,out double elOff,out double raOff,out double decOff,out double lonOff,out double latOff); + + /** + * This method is used internally to know the scan axis/direction os the presently commanded scan + * @param axis indicates which axis is currently involved by the present scan + */ + void getScanAxis(out Management::TScanAxis axis); + + }; + +}; + +#endif diff --git a/Common/Interfaces/AntennaInterface/idl/EphemGenerator.idl b/Common/Interfaces/AntennaInterface/idl/EphemGenerator.idl new file mode 100644 index 000000000..b71317d25 --- /dev/null +++ b/Common/Interfaces/AntennaInterface/idl/EphemGenerator.idl @@ -0,0 +1,152 @@ +/* ************************************************************************************* */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who When What */ +/* Andrea Orlati(aorlati@ira.inaf.it) 10/09/2007 Creation */ +/* Andrea Orlati(aorlati@ira.inaf.it) 15/05/2008 Added method checkTracking */ +/* Carlo Migoni (migoni@oa-cagliari.inaf.it) 04/10/2011 Added computeFlux() method */ +/* Andrea Orlati(aorlati@ira.inaf.it) 15/02/2012 Added getAllCoordinates() method */ + + +#ifndef _EPHEMGENERATOR_IDL_ + +#define _EPHEMGENERATOR_IDL_ + +#include +#include +#include + +#pragma prefix "alma" + +//#ifndef _ACS_PREPROCESSED_ +#include "EphemGeneratorMACRO_include.idl" +//#endif + +module Antenna { + + /** + * @struct EphemGeneratorAttributes This structures enlist all the exposed attributes of the interface. + * All coordinates reported here are apparent, referrred to the current time. + * @arg string sourceID the name or the id of the source + * @arg double rightAscension the current right ascension in radians + * @arg double declination the current declination in radians + * @arg double azimuth current azimuth in radians + * @arg double elevation current elevation in radians + * @arg double julianEpoch the current time as a julian epoch + * @arg double userAzimuthOffset the user azimuth offset currently in use (radians) + * @arg double userElevationOffset the user elevation offset currently in use (radians) + * @arg double userRightAscensionOffset the user right ascension offset currently in use (radians) + * @arg double userDeclinationOffset the user declination offset currently in use (radians) + * @arg double parallacticAngle the parallactic angle in radians + */ + /*DEFATTRIBUTES(EphemGeneratorAttributes) + ENDDEFATTRIBUTES;*/ + + /** + * This IDL interface is the general overview of a generator of ephemeris. All kind of generators (to track a source, to perform a scan or + * whatever) must inherit from this interface. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia + *
+ */ + interface EphemGenerator : ACS::ACSComponent { + + /** + * This method is used to apply new offsets for the topocentric system. Azimuth offset is corrected for the elevation cosine + * before adding it. + * @return true if the offsets are pertinent and could be applied + * @throw CORBA::SystemException + * @param az new offset for the azimuth in radians. + * @param el new offset for the elevation in radians. + */ + //boolean setHorizontalOffsets(in double az,in double el); + + /** + * This method is used to apply new offsets for the equatorial system. RA will be corrected for DEC cosine before adding it. + * @return true if the offsets are pertinent and could be applied + * @throw CORBA::SystemException + * @param ra new offset for the right ascension in radians. + * @param dec new offset for the declination in radians. + */ + //boolean setEquatorialOffsets(in double ra,in double dec); + + /** + * This method is used to apply new offsets for the galactic frame. Longitude will be corrected for the codise of the latitude. + * The offsets are added when the conversion from galactic to equatorial J2000 is performed. + * @return true if the offsets are pertinent and could be applied + * @throw CORBA::SystemException + * @param longitude new offset in galactic longitude in radians + * @param latitude new offset in galactic latitude ion radians + */ + //boolean setGalacticOffsets(in double longitudeOff,in double latitudeOff); + + /** + * This method is used to apply new offsets for the selected frame. Longitude will be corrected for the cosine of the latitude before use, so they are sky offsets. + * If the offset are not pertinent or cannot be applied for the given generator an error is thrown. + * If the new offset are legal, any other previous offsets in other frames are cleared. If the generator is re-initialized, the offsets are kept. + * @throw CORBA::SystemException + * @throw AntennaErrors::AntennaErrorsEx + * @param lon new offset in longitude in radians + * @param lat new offset in latitude in radians + * @param frame offsets reference frame + */ + void setOffsets(in double lon,in double lat,in TCoordinateFrame frame) raises (AntennaErrors::AntennaErrorsEx); + + /** + * This method is only for control software internal use. It used, given a timestamp, to retrive the apparent + * horizontal coordinates in one shot. + * @throw CORBA::SystemException + * @param time this parameter is used to pass the excat time the caller wants to know the topocentric coordinates. + * @param az that's the returned value in radians of the azimuth for the requested time. + * @param el that's the returned value in radians of the elevation for the requested time. + */ + void getHorizontalCoordinate(in ACS::Time time, out double az,out double el); + + /** + * This method should only be used internally to know the apparent coordinates in all frames. + * @throw CORBA::SyStemException + * @param time this indicates the time the coordinates refer to + * @param az the apparent azimuth in radians + * @param el the apparent elevation in radians + * @param ra apparent right ascension in radinas + * @param dec apparent declination in radians + * @param jepoch julian epoch the equtorial coordinates refer to + * @param lon galactic longitude corresponding to the apparent equatorial + * @param lat galactic latitude corresponding to the apparent equatorial + */ + void getAllCoordinates(in ACS::Time time,out double az,out double el, out double ra,out double dec,out double jepoch,out double lon,out double lat); + + /** + * This method is called internally to know if the telescope is tracking the right position or not. The generator will subtract the + * the provided azimuth and elevation to the computed azimuth and elevation for the given time(pointing error). The + * pointing error for both directions(the azimuth is also corrected for cosine of elevation) are then squared and summed; + * the result is then root squared and compared to the tens of the Half Power Bean Width to know if the antenna is where excpected + * or not. In the case of OTF generator the behaviour must be a little different, because this component must also take + * into account the fact that during acceleration ramps the antenna is not,stritcly speaking, tracking. + * The coordinates passed here must be observed (depurated by all the instrumental effects and correction that are used + * to point correctly the telescope) + * @param time represent the time that the provided azimuth and elevation referes to. The component will compute its azimuth + * and elevation in order to compare them. + * @param az the azimuth (radians) of the coordinate where the telescope is, if it is nearby (inside HPBW) the computed (by this + * component) one, the antenna is tracking. + * @param az the elevation (radians) of the coordinate where the telescope is, if it is nearby (inside HPBW) the computed (by this + * component) one, the antenna is tracking. + * @param HPBW the beam width at half power(radians), used to decide if the pointing errors + * @return true if the antenna is tracking, false in all other cases. + */ + boolean checkTracking (in ACS::Time time,in double az,in double el,in double HPBW); + + /** + * This method is used to calculate the flux of a source who's parameter + * are read from the SourceCatalog.xsd from CDB + * @param freq sky frequency at which we'd like to compute the flux of the current target (MHz) + * @param fwhm Full Width Half Maximum (radians) + * @param flux computed flux (Jy) + */ + void computeFlux(in double freq, in double fwhm, out double flux); + }; +}; + +#endif diff --git a/Common/Interfaces/AntennaInterface/idl/EphemGeneratorMACRO_include.idl b/Common/Interfaces/AntennaInterface/idl/EphemGeneratorMACRO_include.idl new file mode 100644 index 000000000..467c4f932 --- /dev/null +++ b/Common/Interfaces/AntennaInterface/idl/EphemGeneratorMACRO_include.idl @@ -0,0 +1,45 @@ +#include + +/** @def DEFATTRIBUTES(NAME) + * @brief this macro can be used to defines exposed attributes by interfaces that inherits from EphemGenerator + * @arg sourceID name or code of the pointed position + * @arg J2000RightAscension J2000 right ascension of the target, it does not include offsets, radians + * @arg J2000Declination J2000 declination of the target, it does not include offsets, radians + * @arg rightAscension apparent right ascension of the pointed position,it includes the offsets, radians + * @arg declination apparent declination of the pointed position,it includes the offsets, radians + * @arg julianEpoch current time as julian epoch + * @arg gLongitude apparent galactic longitude of the pointed position radians, it includes the offsets + * @arg gLatitude apparent galactic latitude of the pointed position radians, it includes the offsets + * @arg apparent azimuth current azimtuh,it includes the offsets, radians, it includes the offsets + * @arg apparent elevation current elevation,it includes the offsets, radians, it includes the offsets + * @arg userAzimuthOffset + * @arg userElevationOffset + * @arg userRightAscensionOffset + * @arg userDeclinationOffset + * @arg userLongitudeOffset + * @arg userLatitudeOffset + * @arg parallacticAngle +*/ +#define DEFATTRIBUTES(NAME) struct NAME { \ + string sourceID; \ + double J2000RightAscension; \ + double J2000Declination; \ + double rightAscension; \ + double declination; \ + double julianEpoch; \ + double gLongitude; \ + double gLatitude; \ + double azimuth; \ + double elevation; \ + double parallacticAngle; \ + double userAzimuthOffset; \ + double userElevationOffset; \ + double userRightAscensionOffset; \ + double userDeclinationOffset; \ + double userLongitudeOffset; \ + double userLatitudeOffset; \ + Management::TScanAxis axis; \ + + +#define ENDDEFATTRIBUTES } + diff --git a/Common/Interfaces/AntennaInterface/idl/Moon.midl b/Common/Interfaces/AntennaInterface/idl/Moon.midl new file mode 100644 index 000000000..b16bfeab2 --- /dev/null +++ b/Common/Interfaces/AntennaInterface/idl/Moon.midl @@ -0,0 +1,57 @@ +/* ************************************************************************************/ +/* IRA Istituto di Radioastronomia */ +/* $Id: Moon.midl,v 1.3 2010-09-24 15:42:03 a.orlati Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL) */ +/* */ +/* Who when What */ +/* Rashmi 13/May/2k8 created */ + +#ifndef _Moon_IDL +#define _Moon_IDL + +#include "baci.idl" +#include +#include + +#pragma prefix "alma" + +module Antenna { + /* + * Here we have defined a struct "MoonAttribute structure" that contains all the properties of the component. + * Since EphemGenerator defines all the properties of the component and we have inherited the Moon component from EphemGenerator. + * This Interface will be mapped into the ACS dynamic component so it can't expose properties in their classic definations. + * Component attributes are read via their accesor method (getAttributes()). * +*/ + DEFATTRIBUTES (MoonAttributes) + ENDDEFATTRIBUTES; + + + interface Moon: EphemGenerator { + /*This is the Interface of the component Moon and this is inherited from EphemGenerator + * all the properties metioned below are inherited by the interface Moon + * # input Source ID:Moon, the name of the source + * # double right Ascension of the Moon in radians + * # double decination of the Moon in radians + * # double azimuth in radians + * # double elevation in radians + * # Julian Epoch the current time as a julian epoch + * # double userAzimuthOffset in radians + * # double userElevationOffset in radians + * # double userRightAscensionOffset in radians + * # double userDeclinationOffset in radians + * # double parallacticAngle in radians + */ + void getAttributes(out MoonAttributes att); /*this method is the attribute accessor*/ + + }; + +}; + + + + + + +#endif + diff --git a/Common/Interfaces/AntennaInterface/idl/Mount.midl b/Common/Interfaces/AntennaInterface/idl/Mount.midl new file mode 100644 index 000000000..7474caf2e --- /dev/null +++ b/Common/Interfaces/AntennaInterface/idl/Mount.midl @@ -0,0 +1,302 @@ +/* **************************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* $Id: Mount.midl,v 1.16 2011-04-22 17:14:50 a.orlati Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(aorlati@ira.inaf.it) 12/04/2007 Creation */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 24/01/2008 Added the operation getEncodersCoorinates */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 10/05/2008 mountStatus changed to Management::TSystemStatus */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 07/07/2008 added forceSection method */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 17/07/2008 added inner method getAntennaErrors */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 18/07/2008 removed the deprecated notification channel */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 02/04/2010 added the method getHWazimuth */ + + +#ifndef _MOUNT_IDL_ + +#define _MOUNT_IDL_ + +#include +#include +#include +#include +#include +#include "AntennaDefinitions.idl" + +#pragma prefix "alma" + +module Antenna { + + + /** + * This is the notification channel name, the Mount client must register to this channel as a consumer. Data will be published on this + * channel when one of the members of the MEDACUDataBlock structure changes its value or when 1 second elapsed since last publication. + * In case of errors and one second elapsed since last publication, the last known good data is published until the error is fixed. + * @deprecated this notification channel is deprecated and will be removed. The data published in this channel are now posted by + * the notifcation channel produced by AntennaBoss. + */ + //const string MOUNT_DATA_CHANNEL="MountData"; + + /** + * Notification channel data structure. The component informs all registered consumers when one of these members change its status + * or value (not including time). In any case data are published at least once a second. In case there are problems with the ACU the last + * available data are published until the problem is fixed. + * Time represents the number of 100 ns since 1582-10-15 00:00:00, it is defined in baci.idl and it is mapped over a longlong type. + */ + //struct MountDataBlock { + // ACS::TimeInterval timeMark; /*!< this is the absolute time taken from the ACU when the reported events occurred */ + // boolean onSource; /*!< true when the antenna is on source or reaches the commanded position */ + //}; + + /** + * This IDL interface describes the CORBA interface of a common mount component. This component allows to control the mount of the italian antennas + * in the most general case and permits to deal with all common operations such as sending the antenna to survival or fixed positions, beggining a + * tracking curve and so on. An easy list of operation required for the user to start tracking a source is: + * @arg \c unstow() the antenna, so that the survival pins are retracted + * @arg \c changeMode(), in order to change the single axis operating mode, for example ACU_PROGRAMTRACK + * @arg \c programTrack(), called several times in order to transfer a tracking curve + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia + *
+ */ + interface Mount : ACS::CharacteristicComponent { + /** This property is the position of the azimuth axe in degrees, limits set in the CDB */ + readonly attribute ACS::ROdouble azimuth; + /** This property is the position of the elevation axe in degrees, limits set in the CDB */ + readonly attribute ACS::ROdouble elevation; + /** This property is the present azimuth error in degrees */ + readonly attribute ACS::ROdouble azimuthError; + /** This property is the present elevation error in degrees */ + readonly attribute ACS::ROdouble elevationError; + /** This property is the present azimuth mode */ + readonly attribute ROTCommonModes azimuthMode; + /**This property is the present elevation mode */ + readonly attribute ROTCommonModes elevationMode; + /** This property reports the last time read from the ACU, it is represented as the number of 100 ns ticks since 1582-10-15 00:00:00 */ + readonly attribute ACS::ROuLongLong time; + /** This property reports the present rate of the azimuth axe in degrees per second. */ + readonly attribute ACS::ROdouble azimuthRate; + /** This property reports the present rate of the elevation axe in degrees per second. */ + readonly attribute ACS::ROdouble elevationRate; + /** This property indicates in which section the antenna is, at preset */ + readonly attribute ROTSections section; + /** This property indicates the offsets that will be added to all azimuth coordinates commanded to the mount (degrees) */ + readonly attribute ACS::ROdouble azimuthOffset; + /** This property indicates the offsets that will be added to all elevation coordinates commanded to the mount (degrees) */ + readonly attribute ACS::ROdouble elevationOffset; + /** This property indicates the time offsets loaded into the ACU. It can be used to load the DUT1 (milliseconds) */ + readonly attribute ACS::ROdouble deltaTime; + /** This property reports the last azimuth position command given to the Mount. In case a PROGRAMTRACK mode is used the value + * reported here is the position in which the component expects the antenna to be. This value is also comprehnsive of the offsets. + */ + readonly attribute ACS::ROdouble commandedAzimuth; + /** This property reports the last elevation position command given to the Mount. In case a PROGRAMTRACK mode is used the value + * reported here is the position in which the component expects the antenna to be. This value is also comprehnsive of the offsets. + */ + readonly attribute ACS::ROdouble commandedElevation; + + /** + * This property if the flag that resumes the whole status of the mount. If a failure or something wrong is detected by the + * component this flag is turned on (MNG_FAILURE) and no more activities will be allowed util the failure is cleared. MNG_WARNING + * is a minor problem so other commands will be accepted but there is no guarantee they will be executed correctly. + */ + readonly attribute Management::ROTSystemStatus mountStatus; + + /** + * It resets all the active errors on the mount + **/ + void reset() raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method can be used to command the antenna to a fixed position. This procedure succeeds only if the antenna is not in ACU_BSY + * status and the mode is ACU_PRESET. + * Range checks are performed in order to verify if the commanded position is inside the limits of the mount for both azimuth and elevation. + * The azimtuh path that will be followed by the mount is the shortest depending on the hard limit of the mount. This means that + * a commanded position of 300 degrees could result in -60 degrees as reported by azimuth property. In order to forse the azimuth sector + * a call to forseSection() must be done. + * In case of a failure an exception is thrown. + * @throw ComponentErrors::ComponentErrorsEx + * @throw AntennaErrors::AntennaErrorsEx + * @throw CORBA::SystemException + * @param az azimuth position to be commanded(degrees). + * @param el elevation position to be commanded(degrees). + */ + void preset(in double az,in double el) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method can be used to command the antenna to move at specific rates. This procedure succeeds only if the antenna is not in ACU_BSY + * and if it is already configured in ACU_RATE mode. Checks are performed in order to make sure the commanded rates are under the limits that the antenna can + * perform, on the contrary the requested rates are decreased.. In case of failure exception is thrown. + * @throw ComponentErrors::ComponentErrorsEx + * @thorw AntennaErrors::AntennaErrorsEx + * @throw CORBA::SystemException + * @param azRate azimuth rate (degrees/second) + * @param elRate elevation rate (degrees/second) + */ + void rates(in double azRate,in double elRate) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method can be used to command/load a tracking curve into the ACU. + * This procedure succeeds only if the antenna is not in ACU_BSY status and the mode is ACU_PROGRAMTRACK. It allows to + * transfer a time stamp and the required position of one particular spot of the trajectory. The time values must continuosly + * increase otherwise the point will be discarded. After one or more data points (According to the interpolation algorithm and the + * function oder) are loaded, the ACU interpolates the points in order to draw the curve. Rnage checks garantee the elevation and the azimuth are + * always inside the limits configured inside the CDB. The decision wether use the CW or CCW sector is made automatically, if the forceSection() has not been issued. + * @throw ComponentErrors::ComponentErrorsEx + * @throw CORBA::SystemException + * @param az azimuth of the data point that will be transfered (degrees) + * @param el elevation of the data point that will be transfered (degrees) + * @param time time stamp of the data point, the mount will try to reach that point at the given time + * @param restart if true the data point stack will be cleared and all previuos loaded point will be lost. + */ + void programTrack(in double az,in double el,in ACS::Time time,in boolean restart) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method can be used to stop all running operation (jobs that requires long time to complete) or in a more simple way to + * stop both antenna axes. That means that all tracking activities are ceased and the axe mode is set to ACU_STOP + * @throw ComponentErrors::ComponentErrorsEx + * @throw AntennaErrors::AntennaErrorsEx + * @throw CORBA::SystemException + */ + void stop() raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method must be used to put the antenna in survival position. Since this operation could take long time the method is implemented + * as an asynchrounos method. This implies that a void CallBack must be supplied in order for the client to be notified when the + * operation completes. At the same time the antenna status is set to MEDACU::ACU_BSY (@sa TStatus), that means the component will + * not accept any other operation before the whole process terminates. The operation can be stopped before it finishes by using the the + * stop() method. The done() method of the CallBack will be informed on operation result with a Completion: + * @arg \c ComponentErrors::NoErrorCompletion + * @arg \c AntennaErrors::StoppedByUserCompletion + * @arg \c ComponentErrors::OperationErrorCompletion + * @throw CORBA::SystemException + * @param callBack void CallBack object + * @param desc Callback description. The Field negotiatable_timeout is ignored, while the normal_timeout is used to command the minimum + * interval (100ns unit) between two calls to the Callback working function. + */ + void stow(in ACS::CBvoid callBack,in ACS::CBDescIn desc); + + /** + * This method must be used to extract the antenna stow pins. Since this operation could take long time the method is inplemented + * as an asynchrounos method. This implies that a void CallBack must be supplied in order for the client to be notified when the + * operation completes. At the same time the antenna status is set to MEDACU::ACU_BSY (@sa TStatus), that means the component will + * not accept any other operation before the whole process terminates. The operation can be stopped before it finishes by using the the + * stop() method. The done() method of the CallBack will be informed on operation result with a Completion: + * @arg \c ComponentErrors::NoErrorCompletion + * @arg \c AntennaErrors::StoppedByUser + * @arg \c ComponentErrors::OperationErrorCompletion + * @throw CORBA::SystemException + * @param callBack void CallBack object + * @param desc Callback description. The Field negotiatable_timeout is ignored, while the normal_timeout is used to command the minimum + * interval (100ns unit) between two calls to the Callback working function. + */ + void unstow(in ACS::CBvoid callBack,in ACS::CBDescIn desc); + + /** + * This method can be used to program different modes for both antenna axes. In order to obtain a more clear component + * working (more than one way to do the same thing) the selectable modes have been limited. The properties elevationMode and + * azimuthMode are not affected by a call to this method, i.e. they are always read from the ACU. + * In the operation completes succesfully it also clears the offsets. + * @throw ComponentErrors::ComponentErrorsEx + * @thorw AntennaErrors::AntennaErrorsEx + * @throw CORBA::SystemException + * @param azMode The commanded mode for the azimuth axis. It can be: ACU_PRESET, ACU_PROGRAMTRACK,ACU_RATE, + * @param elMode The commanded mode for the elevation axis. It can be: ACU_PRESET, ACU_PROGRAMTRACK,ACU_RATE + */ + void changeMode(in TCommonModes azMode,in TCommonModes elMode) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method should be used to load last-minute pointing offsets into the Antenna Control Unit; for example offsets coming from + * temperature or wind measurments. The values can read back from azimuthOffset elevationOffset properties. Offsets can be applied only if the + * ACU is in ACU_PRESET or ACU_PROGRAMTRACK mode. All other modes trigger an exception. + * If the hardware doesn't support this feature (like the ACU of Medicina) the implementation of this interface will simulate it by adding the current + * offsets before commandig any new position to the mount. Range checks are not performed. + * @throw ComponentErrors::ComponentErrorsEx + * AntennaErrors::AntennaErrorsEx + * @throw CORBA::SystemException + * @param azOff The new offset in azimuth. + * @param elOff The new offset in elevation. + */ + void setOffsets(in double azOff,in double elOff) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This will set the timer of the Antenna Control Unit to the give time + * @throw ComponentErrors::ComponentErrorsEx + * @throw AntennaErrors::AntennaErrorsEx + * @throw CORBA::SystemException + * @param now The ACU time will be set to this value, in 100 ns units since 1582-10-15 00:00:00. + */ + void setTime(in ACS::Time now) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method should be used to load a time offset into the Antenna Control Unit; this value will be added to the ACU internal clock + * in order to obtain the real time (used in trajectory fitting routines) of the Mount. For example if this value is set to the current DUT1 + * value the ACU will work in UT1 instead of UTC. The last set value can be read back form the deltaTime property. If the ACU doesn't + * support this feature (like the ACU of Medicina) this method has no effect. + * @throw ComponentErrors::ComponentErrorsEx + * @thorw AntennaErrors::AntennaErrorsEx + * @throw CORBA::SystemException + * @param delta tjat's the new time offset in milliseconds. + */ + void setDeltaTime(in double delta) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method is used internally by client component. It is used to read the azimuth, elevation, azimuthOffset and elevationOffset in one shot. + * All these information are marked with a timestamp. The returned values are in degrees. At any time if you want to know the obseverd sky point + * you have to subtract to each coordinate the respective offset. + * @param time this timestamp marks the other values returned by this method + * @param azimuth returns the azimuth read directly from the mount encoders + * @param elevation returns the elevation read directly from the mount encoders, it is exactly the same value of the property elevation + * @param azOff returns the value of the instant offset for the azimuth axe. This value is the last commanded by the method setOffsets. + * @param elOff returns the value of the instant offset for the elevation axe. This value is the last commanded by the method setOffsets. + * @param section this parameter brings the information of the section in which the mount is at the epoch given by parameter time. + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @thorw AntennaErrors::AntennaErrorsEx + */ + void getEncoderCoordinates(out ACS::Time time,out double azimuth,out double elevation,out double azOff, + out double elOff,out TSections section) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method is internally used to retrieve antenna errors in one time. + * @param time this is the timestamp that marks the other values returned by this method + * @param azError error in azimuth in degrees + * @param elError error in elevation in degrees + * @throw CORBA::SystemException + * @throw ComponentErrors::ComponentErrorsEx + * @thorw AntennaErrors::AntennaErrorsEx + */ + void getAntennaErrors(out ACS::Time time,out double azError,out double elError) raises (ComponentErrors::ComponentErrorsEx,AntennaErrors::AntennaErrorsEx); + + /** + * This method is used internally by client components. It can be used to force the azimuth range the mount will travel in order to reach the + * next commanded point (@sa preset() or programTrack()). If this method is not used the default behavoiur + * of the mount is to follow the shortest trip. Of course wrap cable limits are always taken into account. The possible section are + * ACU_CW(generally for azimuth grater than 180 degrees) and ACU_CW (generally for azimuth lesser than 180 degrees). + * The ACU_NEUTRAL option does not change the default behaviour of the mount. This method is usefull at the beginning of a + * tracking curve for example to ensure to enough travel to follow a source from rise to set. When the first point of the tracking is commanded + * the ACU will be reset to the default section (ACU_NEUTRAL) so that all following point are determined through the algorithm of + * minimum distance. + * @param section select the travel range of the next tracking point + * @throw CORBA::SystemExcpeption + */ + void forceSection(in TSections section); + + /** + * This method can be used to know which direction in azimuth the component will drive the antenna with respect to the real azimuth ranges. + * the result depends on present azimuth, on the destination azimuth, on the azimuth hardware limits and on the preferred section. + * @throw CORBA::SystemException + * @param destination the destination azimuth on degrees. + * @param section preferred section + * @return the real azimuth coordinate of the destination it could overcome the standard limits of 0..360 + */ + double getHWAzimuth(in double destination,in TSections section); + +}; + + +}; + +#endif diff --git a/Common/Interfaces/AntennaInterface/idl/OTF.midl b/Common/Interfaces/AntennaInterface/idl/OTF.midl new file mode 100644 index 000000000..31e55bafa --- /dev/null +++ b/Common/Interfaces/AntennaInterface/idl/OTF.midl @@ -0,0 +1,117 @@ +/* **************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* $Id: OTF.midl,v 1.8 2011-05-10 15:15:33 a.orlati Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL) */ +/* */ +/* Who when What */ +/* Simona Righini 19/03/2008 created */ +/* Simona Righini 15/09/2008 revised */ + +#ifndef _OTF_IDL +#define _OTF_IDL + +#include +#include "EphemGenerator.idl" +#include +#include +#include "AntennaDefinitions.idl" + +#pragma prefix "alma" + +module Antenna { + + /** + * @struct OTFAttributes defines a structure that contains all the properties of the component + * (inlcuded the inherited form the interface EpehemGenerator). + * This interface will be mapped into an ACS dynamic component so it can not expose properties in their classic definition. So the + * component attributes are read via their accesor method (getAttributes()). + */ + DEFATTRIBUTES(OTFAttributes) + double startLon; /** longitude of the subscan starting point (radians), if RA it must be J2000, offset included*/ + double startLat; /** latitude of the subscan starting point (radians), if Dec it must be J2000, offset included*/ + double stopLon; /** longitude of the subscan ending point (radians), if RA it must be J2000, offset included*/ + double stopLat; /** latitude of the subscan ending point (radians), if Dec it must be J2000, offset included*/ + double centerLon; /** longitude of the subscan central point (radians), if RA it must be J2000, offset included*/ + double centerLat; /** latitude of the subscan central point (radians), if Dec it must be J2000, offset included*/ + double centerGLon; /** longitude relative to glactic frame of the central point (radians), offsets are not included */ + double centerGLat; /** latitude relative to glactic frame of the central point (radians), offsets are not included */ + double centerRA; /** RAJ2000 of the subscan central point (radians), offsets are not included*/ + double centerDec; /** DecJ2000 of the subscan central point (radians), offsets are not included*/ + double centerAz; /** azimuth of the subscan central point (radians), offsets are not included */ + double centerEl; /** elevation of the subscan central point (radians), offsets are not included */ + double lonSpan; /** total length of the subscan along longitude axis (radians)*/ + double latSpan; /** total length of the subscan along latitude axis (radians)*/ + double skySpan; /** absolute amplitude of subscan (radians)*/ + double lonRate; /** longitude rate (radians/s) */ + double latRate; /** latitude rate (radians/s) */ + double skyRate; /** sky rate (radians/s) */ + double subScanSpan; /** amplitude of the great circle arc connecting start and stop points */ + double phiRate; /** scan rate in case of great circle scan (radians/s) */ + ACS::TimeInterval rampDuration; /** duration of one acceleration or deceleration ramp */ + TCoordinateFrame coordFrame; /** reference frame of the input start-stop or center coordinates */ + TsubScanGeometry geometry; /** geometry of the subscan path: along the great circle or along one of the frame axes */ + TCoordinateFrame subScanFrame; /** reference frame for scan motion: equatorial, galactic or horizontal */ + + TsubScanDescription description; /** subscan mode description: start+stop or center+span (the latter does not apply to great circle geometry)*/ + TsubScanDirection direction; /** subscan direction: states if coordinate increases or decreases during scan + Does not apply to great circle geometry */ + ACS::Time startUT; /** Subscan starting UT time (absolute: 100ns since 1582-10-15 00:00:00) */ + ACS::TimeInterval subScanDuration; /** subscan duration (100ns) */ + + ENDDEFATTRIBUTES; + + /** + * Component in charge of computing the on-the-fly subscan path along + * equatorial, galactic, horizontal user frames or along an arbitrarily + * rotated spherical frame (e.g. to scan a wide source along its axes) + * @author Simona Righini, + * Istituto di radioastronomia, Italia + *
+ **/ + interface OTF: EphemGenerator { + + /** + * This method is the attributes accessor. The only way to read the properties externally + * @throw CORBA::SystemException + * @param att this parameter is used to return the structure that contains all the values for each attribute of this class. + * Caller must take care of freeing the parameter. + */ + void getAttributes(out OTFAttributes att); + + /** + * Sets all the subscan parameters. + * @param targetName allows to give a target name, it could be a real source name or just a place holder + * @param initAz Azimuth position of antenna at subscan setup time + * @param initSector Azimuth section (CW or CCW) of init point + * @param initEl Elevation position of antenna at subscan setup time + * @param initTime UT instant of subscan setup call + * @param lon1 Longitude of subscan starting point or of central point. + * @param lat1 Latitude of subscan starting point or of central point. + * @param lon2 Longitude of subscan stopping point or subscan longitude span. + * @param lat2 Latitude of subscan stopping point or subscan latitude span. + * @param coordFrame input coordinates reference frame: equatorial (J2000), galactic or + * horizontal. + * @param geometry Subscan geometry: along great circle, along longitude + * or along latitude. + * @param subScanFrame Subscan reference frame: equatorial (J2000), galactic or + * horizontal. + * @param description Subscan mode description: start+stop or center+span + * Center+span does not apply to great circle geometry. + * @param direction Subscan direction: along increasing or decreasing + * coordinates. Does not apply to great circle geometry. + * @param startUT Subscan starting UT time (absolute). If zero, the component will answer back with the computed/expected start time. + * @param subScanDuration subscan duration (100ns). + * @return Azimuth sector (CW or CCW) of the subscan start position + * @throw CORBA::SystemException + * @throw AntennaErrors::AntennaErrorsEx + * @throw ComponentErrors::ComponentErrorsEx + */ + Antenna::TSections setSubScan(in string TargetName, in double initAz, in TSections initSector, in double initEl, in ACS::Time initTime, in double lon1, in double lat1, + in double lon2, in double lat2, in TCoordinateFrame coordFrame, + in TsubScanGeometry geometry, in TCoordinateFrame subScanFrame, in TsubScanDescription description, + in TsubScanDirection direction, in ACS::Time startUT, in ACS::TimeInterval subScanDuration) raises (AntennaErrors::AntennaErrorsEx,ComponentErrors::ComponentErrorsEx); + + }; +}; +#endif diff --git a/Common/Interfaces/AntennaInterface/idl/Observatory.midl b/Common/Interfaces/AntennaInterface/idl/Observatory.midl new file mode 100644 index 000000000..9b80b58ba --- /dev/null +++ b/Common/Interfaces/AntennaInterface/idl/Observatory.midl @@ -0,0 +1,178 @@ +/* *********************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* $Id: Observatory.midl,v 1.6 2011-06-21 16:32:35 a.orlati Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 16/01/2006 Creation */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 08/01/2007 Ported to ACS 5.0.4 */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 28/03/2007 Ported to ACS 6.0.2 */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 25/10/2007 Added the Epehemeris interface hierarchy */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 29/08/2010 added the attribute observatoryName */ + +#ifndef _OBSERVATORY_IDL +#define _OBSERVATORY_IDL + +#include +#include +#include +//#include +#include "AntennaDefinitions.idl" + +#pragma prefix "alma" + +module Antenna { + + /** + * This is the Observatory component interface. This component will be used as the "official" observatory time + * distributor. It also stores site information that are required for time and coordinates computations/convertions. The site is + * stored as from cartesian coordinates to geodetic ones and viceversa. geodetic coordinates conversion depends on the choosen + * ellipsoid model. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia + *
+ */ + interface Observatory: ACS::CharacteristicComponent + { + /** + * This property is the name of the observatory. + */ + readonly attribute ACS::ROstring observatoryName; + + /** + * This property is the current observatory time. In practical this is the time reported by the local machine that runs the component. + * This machine should be synchronized via NTP at the UTC time. It is represented as the number of 100 ns ticks since 1582-10-15 00:00:00 + */ + readonly attribute ACS::ROuLongLong universalTime; + + /** + * This property is the current observatory time as a Julian day. In practical this is the time reported by the local machine that runs the component. + * This machine should be synchronized via NTP at the UTC time. + */ + readonly attribute ACS::ROdouble julianDay; + + /** + * This property is the Greenwich Apparent Sidereal Time for the current date. + * Apparent GST is the MGST (Mean Greewich Sidereal Time) corrected for nutation shift of the ecliptic obliquity (due to Moon). + * This machine should be synchronized via NTP at the UTC time. It is represented as the number of 100 ns ticks + */ + readonly attribute ACS::ROuLongLong GAST; + + /** + * This property is the Local Apparent Sidereal Time for the current date and time. + * This time if computed from the GAST by adding the site longitude and the current time (corrected for sidereal mean day). + * This machine should be synchronized via NTP at the UTC time. It is represented as the number of 100 ns ticks + */ + readonly attribute ACS::ROuLongLong LST; + + /** + * This property stores the current DUT1 in milliseconds, i.e. the difference between UTC and UT1. + */ + readonly attribute ACS::ROdouble DUT1; + + /** + * This property stores the geodetic north latitude (radians) of the observatory. + */ + readonly attribute ACS::ROdouble latitude; + + /** + * This property stores the geodetic east longitude (radians) of the observatory + */ + readonly attribute ACS::ROdouble longitude; + + /** + * This property stores the height over the ellipsoid (meters) of the observatory + */ + readonly attribute ACS::ROdouble height; + + /** + * Sets the X polar motion with respect to the IERS reference pole (motion angle along the Greenwich meridian in milliarcseconds). + * This information will be used to correct the site longitude and latitude for polar motion and compute the azimuth + * difference between celestial and terrestial poles. Information can be retrived from http://hpiers.obspm.fr/eop-pc/. + */ + readonly attribute ACS::ROdouble yPolarMotion; + + /* + * Sets the Y polar motion with respect to the IERS reference pole (motion angle along the meridian 90° east in milliarcseconds). + * This information will be used to correct the site longitude and latitude for polar motion and compute the azimuth + * difference between celestial and terrestial poles. Information can be retrived from http://hpiers.obspm.fr/eop-pc/. + */ + readonly attribute ACS::ROdouble xPolarMotion; + + /** + * This property stores the X geodetic coordinate of the observatory (meters). X=0 is plane of the Greenwich meridian. + */ + readonly attribute ACS::ROdouble xGeod; + + /** + * This property stores the X geodetic coordinate of the observatory (meters). Y=0 is plane of the meridian 90 + * degrees east of the Greenwich meridian. + */ + readonly attribute ACS::ROdouble yGeod; + + /** + * This property stores the X geodetic coordinate of the observatory (meters). Z=0 is plane of the equator. + */ + readonly attribute ACS::ROdouble zGeod; + + /** + * This property reports the current model of geoid currently in use. + */ + readonly attribute ROTGeodeticModel geodeticModel; + + /** + * This method is used to get the whole salient information about the site in a single shot. This avoids multiple + * acceses the the component in order to get all the information stored in the component. + * @return a structure containing the following fields: + * @arg \c double longitude + * @arg \c double latitude + * @arg \c double height + * @arg \c double xP + * @arg \c double yP + * @arg \c long elipsoid + * @arg \c double DUT1 + */ + TSiteInformation getSiteSummary(); + + /** + * This method sets the current value of the DUT1 property. + * @throw CORBA::SystemExcpetion + * @throw ComponentCommonErrors:ComponentCommonErrorsEx + * @arg \c ComponentCommonErrors::CDBAccess + * @arg \c ComponentCommonErrors::PropertyError + * @param val new DUT1 value in milliseconds. + * @param save if true the value passed to this function will be saved into the CDB as the default value of DUT1 + */ + void setDUT1(in double val,in boolean save) raises (ComponentErrors::ComponentErrorsEx); + + /** + * This method changes the current model for the geoid, in other words it sets the value returned + * by the property geodeticModel. + * @throw CORBA::SystemExcpetion + * @throw ComponentCommonErrors:ComponentCommonErrorsEx + * @arg \c ComponentCommonErrors::CDBAccess + * @arg \c ComponentCommonErrors::PropertyError + * @param model the new model, it can be one of the symbols defined in the TGeodeticModel enumeration. + * @param save if true the new model will be saved into the CDB and it will be the default value for the property + * geodeticModel the next time the component is started. + */ + void setGeodeticModel(in TGeodeticModel model,in boolean save) raises (ComponentErrors::ComponentErrorsEx); + + /** + * This method changes the current value for x/yPolatMotion properties. + * @throw CORBA::SystemException + * @throw ComponentCommonErrors:ComponentCommonErrorsEx + * @arg \c ComponentCommonErrors::CDBAccess + * @arg \c ComponentCommonErrors::PropertyError + * @param xP motion angle along the Greenwich meridian (milli arcseconds) + * @param yP motion angle along the 90 east meridian (milli arcseconds) + * @param save if true the values passed to this function will be saved into the CDB as the default value of xPolarMotion + * and yPolarMotion respectively. + */ + void setPoleMotion(in double xP,in double yP,in boolean save) raises (ComponentErrors::ComponentErrorsEx); + + }; + +}; +#endif diff --git a/Common/Interfaces/AntennaInterface/idl/PointingModel.idl b/Common/Interfaces/AntennaInterface/idl/PointingModel.idl new file mode 100644 index 000000000..358e78e3c --- /dev/null +++ b/Common/Interfaces/AntennaInterface/idl/PointingModel.idl @@ -0,0 +1,54 @@ +/* ***************************************************************************/ +/* INAF - Istituto Nazionale di AstroFisica */ +/* IRA - Istituto di Radioastronomia */ +/* OAC - Osservatorio Astronomico di Cagliari */ +/* */ +/* $Id: PointingModel.idl,v 1.8 2008-02-01 09:37:50 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who When What */ +/* Carlo Migoni (c.migoni@ira.inaf.it) 02/04/2007 Creation */ +/* */ +/* ***************************************************************************/ + +#ifndef _POINTINGMODEL_IDL_ + +#define _POINTINGMODEL_IDL_ + +#include +#include +#include + +#pragma prefix "alma" + +module Antenna { + /** + * This IDL module describes the CORBA interface of the Pointing Model. + * @author Carlo Migoni + * INAF - Istituto Nazionale di AstroFisica + * IRA - Istituto di Radioastronomia + * OAC - Osservatorio Astronomico di Cagliari + *
+ */ + interface PointingModel : ACS::ACSComponent { + /** + * This method is used to calculate the azimuth and elevation offsets (radians) + * @throw CORBA::SystemException + * @throw AntennaErrors::ReceiverNotFoundEx + * @param azimuth + * @param elevation + * @param azOffset + * @param elOffset + */ + void getAzElOffsets(in double azimuth, in double elevation, out double azOffset, out double elOffset) raises (AntennaErrors::AntennaErrorsEx); + /** + * This method is used to set the receiver for the observation + * @throw CORBA::SystemException + * @param receiverCode + */ + void setReceiver(in string receiverCode) raises (AntennaErrors::AntennaErrorsEx); + }; +}; + +#endif diff --git a/Common/Interfaces/AntennaInterface/idl/Refraction.idl b/Common/Interfaces/AntennaInterface/idl/Refraction.idl new file mode 100644 index 000000000..b379145db --- /dev/null +++ b/Common/Interfaces/AntennaInterface/idl/Refraction.idl @@ -0,0 +1,49 @@ +/* ***************************************************************************/ +/* INAF - Istituto Nazionale di AstroFisica */ +/* IRA - Istituto di Radioastronomia */ +/* OAC - Osservatorio Astronomico di Cagliari */ +/* */ +/* $Id: Refraction.idl,v 1.5 2009-01-29 12:37:55 c.migoni Exp $ */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who When What */ +/* Carlo Migoni (c.migoni@ira.inaf.it) 01/02/2008 Creation */ +/* Carlo Migoni (c.migoni@ira.inaf.it) 27/02/2009 Removed SetMeteoParameters + * method */ +/* Andrea Orlati (a.orlati@ira.inaf.it) 09/10/2013 getCorrection() now requires the wavelength as input argument*/ +/* ***************************************************************************/ + +#ifndef _REFRACTION_IDL_ + +#define _REFRACTION_IDL_ + +#include +#include +#include + +#pragma prefix "alma" + +module Antenna { + + /** + * This IDL module describes the CORBA interface of the Refraction. + * @author Carlo Migoni + * INAF - Istituto Nazionale di AstroFisica + * IRA - Istituto di Radioastronomia + * OAC - Osservatorio Astronomico di Cagliari + *
+ */ + interface Refraction : ACS::ACSComponent { + /** + * This method is used to calculate the corrected zenith distance (radians) due to refraction + * @throw CORBA::SystemException + * @param obsZenithDistance + * @param waveLegth the lambda (meters) of the current observation + * @param corZenithDistance + */ + void getCorrection(in double obsZenithDistance, in double waveLength, out double corZenithDistance); + }; +}; + +#endif diff --git a/Common/Interfaces/AntennaInterface/idl/SkySource.midl b/Common/Interfaces/AntennaInterface/idl/SkySource.midl new file mode 100644 index 000000000..5404c6de6 --- /dev/null +++ b/Common/Interfaces/AntennaInterface/idl/SkySource.midl @@ -0,0 +1,124 @@ +/* *********************************************************************************************************** */ +/* IRA Istituto di Radioastronomia */ +/* */ +/* This code is under GNU General Public Licence (GPL). */ +/* */ +/* Who when What */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 10/09/2007 Creation */ +/* Andrea Orlati(a.orlati@ira.inaf.it) 08/04/2013 setFixedPoint() has a new argument that allows to give a target id*/ +/* Andrea Orlati(a.orlati@ira.inaf.it) 12/06/2014 added reference frame and velocity definition among the exported attributes */ + + +#ifndef _SKYSOURCE_IDL +#define _SKYSOURCE_IDL + +#include +#include "EphemGenerator.idl" +#include +#include +#include "AntennaDefinitions.idl" + +#pragma prefix "alma" + +module Antenna { + + /** + * @struct SkySourceAttributes defines a structure that contains all the properties of the component + * (inlcuded the inherited form the interface EpehemGenerator). + * This interface will be mapped into an ACS dynamic component so it can not expose properties in their classic definition. So the + * component attributes are read via their accessor method (getAttributes()). + * @arg ìnputRightAscension the right ascension of the source taken from the catalog in radians + * @arg inputDeclination the declination of the source taken from the catalog in radians + * @arg inputJEpoch the julian epoch the catalog RA and Dec refer to + * @arg inputRaProperMotion the proper motion in right ascension (milli arcseconds per tropical year if FK4 is used, per julian year if Fk5 is used) + * @arg inputDecProperMotion the proper motion in declination (milli arcseconds per tropical year if FK4 is used, per julian year if Fk5 is used) + * @arg inputParallax the parallax in milli arcseconds. + * @arg inputRadialVelocity the radial velocity in Km/sec ( positive value means the source is moving away) + * @arg inputGalacticLongitude the galactic longitude of the source in radians + * @arg inputGalacticLatitude the galactic latitude of the source in radians + * @arg J2000RightAscension the right ascension of the source at J2000 + * @arg J2000Declination the declination of the source at J2000 + */ + DEFATTRIBUTES(SkySourceAttributes) + double inputRightAscension; /** the right ascension of the source taken from the catalog in radians*/ + double inputDeclination; /** the declination of the source taken from the catalog in radians*/ + double inputJEpoch; /** the julian epoch the catalog RA and Dec refer to */ + double inputRaProperMotion; /** the proper motion in right ascension (milli arcseconds per tropical year if FK4 is used, per julian year if Fk5 is used)*/ + double inputDecProperMotion; /** the proper motion in declination (milli arcseconds per tropical year if FK4 is used, per julian year if Fk5 is used) */ + double inputParallax; /** the parallax in milli arcseconds. */ + double inputRadialVelocity; /** the radial velocity in Km/sec ( positive value means the source is moving away) */ + Antenna::TReferenceFrame inputVradFrame; /** reference frame of the radial velocity */ + Antenna::TVradDefinition inputVradDefinition; /** definition of the radial velocity */ + double inputGalacticLongitude; /** the galactic longitude of the source in radians */ + double inputGalacticLatitude; /** the galactic latitude of the source in radians*/ + ENDDEFATTRIBUTES; + + /** + * This is the interface of the component SkySource. This component can generates the horizontal + * coordinates that can be passed to the telescope in order to do a sidereal tracking. In all cases + * these coordinates are apparent that means the instrumental effect of the telescope are not + * considered. All the attributes exposed in this component can be accessed in one shot via the + * getAttributes() method. + * @author Andrea Orlati, + * Istituto di Radioastronomia, Italia + *
+ */ + interface SkySource: EphemGenerator { + + /** + * This method is the attributes accessor. The only way to read the properties externally + * @throw CORBA::SystemException + * @param att this parameter is used to return the structure that contains all the values for each attribute of this class. + * Caller must take care of free the parameter. + */ + void getAttributes(out SkySourceAttributes att); + + /** + * This operation try to load all the data required by a source form the configuration database. + * @throw AntennaErrors::SourceNotFoundEx + * @throw ComponentErrors:CDBFieldFormatEx + * @throw CORBA::SystemException + * @param sourceName this is the name of the source or the idintification code of the source. It is used to search the CDB. + */ + void loadSourceFromCatalog(in string sourceName) raises (ComponentErrors::ComponentErrorsEx, + AntennaErrors::AntennaErrorsEx); + /** + * Sets the source as fixedposition in the horizontal system + * @throw CORBA::SystemException + * @param identifier of the target + * @param az fixed azimuth position in radians + * @param el fixed elevation position in radians + */ + void setFixedPoint(in string sourceName,in double az,in double el); + + /** + * This operation changes the current tracked source by givin its galactic coordinates. + * @throw CORBA::SystemException + * @param sourceName the name of the source + * @param latitude galactic latitude of the source in radians + * @param longitude galactic longitude of the source in radians + */ + void setSourceFromGalactic(in string sourceName,in double longitude,in double latitude); + + /** + * This operation changes the current tracked source by giving its equatorial coordinates. + * @throw CORBA::SystemException + * @param sourceName the name of the source + * @param ra right ascension of the source in radians + * @param dec declination of the source in radians + * @param equinox equinox which the above coordinates refer to + * @param dra proper motion in right ascension in mas/year (milli seconds of arc year (tropical) if FK4 is used, per + * year (julian) if Fk5 is used). dRA/dt*cos(DEC) is assumed + * @param ddec proper motion in declination in mas/year (milli seconds of arc per year (tropical) if FK4 is used, + * per year (julian) if Fk5 is used) + * @param parallax parallax in milli arcseconds. + * @param rvel radial velocity in Km/sec ( positive value means the source is moving away) + */ + void setSourceFromEquatorial(in string sourceName,in double ra,in double dec,in TSystemEquinox equinox,in double dra, + in double ddec,in double parallax,in double rvel); + }; + +}; + + +#endif diff --git a/Common/Interfaces/AntennaInterface/images/Antenna.png b/Common/Interfaces/AntennaInterface/images/Antenna.png new file mode 100644 index 0000000000000000000000000000000000000000..1a65fcd14d203cbe5d825cb6f99200f540ad6e57 GIT binary patch literal 406112 zcmeAS@N?(olHy`uVBq!ia0y~y;5yF0!1kVliGhK^H>vM#| zcd`F@A9HZ^N72a2u#{Bgh?^@yEVl1mb@^>p^5In*Gq>JYx`;0%i)oLNU$idY8U?-; zM;g3j0uJVdN(HZcuz=~DSIdlW-NNvtg{zhoYVFz@zT3pDJTTW(FgbVCtz9m!FZ!zN zukZ1cInL*I;=PUhS@~~2&dfAUuC|$1d9HXyh!(3+E|2kj-5Kg%HY&CVIB_5o6H*h7 z)|e+;OrCcC@7F7vdY39-sz|E|Ie2JK^qxO?w}nx4gAC(7*b>9Ka^BAjx4NFPebENo z5^U0;9N*8DTccP6Qra@%{PG`0!F1%RwtCHOlC0P;Zgqkpn+AUJ&Esl?qjcSYyrz0C$b1}o+|BdVQ5HXc#tQ- z(|oXE;n7uR6C`53Ey>RNy1=99poIk6Dxo>Wj(Y7bP2t)f6lUsOKA${WP>9oluYFDO zS}ENLK1~p-ko74htRbf1gm)Dt0@Yt-Bb>v*mEYk^@XmTt^K|E>1~SLJh0PGc!W8 zrhe>kT$TP$YBKj?*EDW%skX#Tv&xS(wpGeCpi{~F-o4#BgTleBi z#af}YayA~1#Q%5BRg1|!Zm{5Tf=9!4Su5FjT8-P8wU1w$pEQH@?=k_Sc(DhHQ_k#W z{ip4Qi1!nhoMUTG>{)#JP|C?j!~47uQM;Heg8G|FIob;svcBtnY0%WD5n=Y%!rQ)I z*sSFDL=T^^;>M%jW?d}cnSSR5Z$kOk8&ctgFWHSO8%k7@<{aeBx0-+O#hj@Q-R%DB zj&n-iD?PAW(LF3)rJi72fKb zJ5^&+!c>t?7PiM4&klTkEN1w^@WA6J>v;i5e}5I~_o^(9$=NQc-uIAMT!{0F>GO<- za}^jgrZ6lBVLGtPXiLSV^_y~j9pse0cIrbI^S3vLjI-Ws_bK&9bB2HuMEFzf{USgHDkhNw*7&RyY*^b9Ga`Jk8{CVQHEQ$ z3QxD6x4!u7=!Ayz)&~pGvog2D;SBE((a(3eoK6V2fYNg^f0T{JqyyI*x4&h0kaJ9) z=SMb2_#KPK65%&)_6RaA<8o2Hk$1>JWcnS32PF<#u3zw$^=#k$*gJKUz}6Jf|Q*=DP+?O z)~dt*q8n#wxp73QK~i&Mf$~{{sFZC53lk;M98L2jG;|MUN$&cSY%B>WRIYdh@oZjj zU&QIzX(pQ%KW`&V50xA%=2KoD{??qeTmHXW;PjzA*Pm3F+p2IK&IpxGo%T2Mo7;8; zjJF`Y$Xv_O!K`Z47>u#z|&5YjpdGEC&69URN1ck>%RUZ)CDQ^1K zq(aY}!NX2K#q~{u^t1-_WW6~=@2a2kv!^$YYX(;sPGXJ~Q}Y&lsud9>mAgauoL`7T z8q47eUv>yb^5nS39-F?FL2FgcG%NMCh4mL-{WmJPdpqN1{L7m4SBr0&M_CBge_F{T|h`|KGeHc9i|` zx5;^n56<%8+Pq^fa?!AfW2yceKIOZHITF*D{rWB!AFaAwSe|y$AwMEGOj+}iw@OrO zWvaolbMvhZZF?mxwzKE{B zHHrVy_0pep_ja7sn)t%fFW=Ur>}$mqhFC_ml){B8nwCCYBD+##o7C~MK17}c4 z{vExw>Ta9Il=~l7>DEU1fRYp}g{35|H#ksttM(uB`gfJ3$JNhDNS4pHo7XY>`>cJt zYd8Mf|C;G2{293N|-jT%Tpd$78 zE|h;ebJyy?>qbsu`dwNIEdopojqeKnPW)W@Tl?@skJGI4AIo;v z$R7XxnPHFlt{q8#XMJ^JsHx8>5&W4ICbQgO)1n2TCsJj?m>9ws8e+~dCR{$v6~XE6 zo%|v{@OG!z@!h5SX7BxW`CUz@;HEogtA9z(lB-9Q{4={c_a6H2!LR=FPAlJ;r|M2k zioCZYG`a3@z@ng8_YD|3T$C8RLcAD+#8kDGR&3oiA!*jxtfRu4*6BM>k44ZajsI}M;;v7g6DpVAT(hd~?t^_# z-g3t1++Vb9ep&dtE1FY_7*c0nnK#XCqr_>uU8|mOFdSijT*Ju8V|3GRM@sfm-u%#a zw=OTKb4$D#Z+dmDLW*SMy2Z?Tf<0n9&dhHFVbQe2;bmMR`{lid^ma)_1DLcx9Wx6jS^Sk5loc`}GeB;w4T>ji5T9<4no{(?93y;;w?iP2N_6s8w49Pu*R zz1lX$o2TK%)||hSt&glrwf6b??Q-7j!p~F6SQS&^d^)rewtT+W<7w*`ueU4Ads^E) zhBlTx3uezuYI*YT-wHRsPy^)){vHohfBe%rL%Fm7k39D~H0 z>9dvyz0At|5_hKT%G19l3OzoFZ{OzD-CrAUKK$%Gv;78B-uzrO^D!4kqC(3ASFNkg zjjZr2sTpuCE^(4l*sd;Lm6jg~bF`mT*v;G7aWCO1d(zwMGN;s2USEHIqDIrw=xNfk zyUUW*qhjQ@s0le0$KO37#`fNYK||DtVRA|M;&rJlIzhsVxTXc|-_9zb=y>8w2CR|v zv(j$c=Z!m-biDmw+Ffi_o4(fl+-|)ev(9Zhl@fGWyPqREvn(p>|C5sVkCyjVW@nYO zzCWg>Z@(&O_qs3UT1$i0*+it)-BsZ`wN)oTspOMK$>YkEiw-cs;;BVMCw;xaVYArR zqVq3?mvTk}5*KN>CW%THhbIK?Q_L@GP~b9m16#MFgHpS-p> zJk98Se3kF*(?>oEx;(5l{H@uaSKRq_hqS}jIA(^kX{G1hWnJ0YGvR2rXKLK>lo?CK zLJe+*XG*rsoXvf(eQkv9;l$T5YhDKio&Nmk`{O;=PpYU)`tra*yD@RWxhCzk5sZH> zHXU2GF`(fd17BpJdW+zL^3;q%=an+$$3Mo~FP@>j;)bBM-qr_?SKkO`Wmqe>C$d@o z-Q)26N8CjJWgN`37UIk?K2R&_D#Y;O`Ns8Z@jni3x{-ZscV9^^|D=~pkJ@}rZ~AdV zXQQ*mOu^PaLT7LKb4Jc7lDB`^u=$4Jt&Qace14If&^GFX)Kt!ROG!5Q?$g%`Kki^? zczokWLe2GgYX7J2-L%!{d*$qZN29K~MaJ)tZTPLce(S+r!G%TJ6|bGI&i`g6w|bkb zd3Ds^t@TA*O$Gmt^YtZj>#!Xty%(Kb_>Dy`>r_Zmv4q>|fD=5?rn=!ZI^3sUtNqsO z{t;ATkY`(T?{}ucM30WUS7V;PGUz$Mus-C}Wd4>T0YQ54i(*f|$l{Oe(pdGtFx;?s zd()?{p|;l=CYKqUIrOr5pH3dXzscM0zgFc`Qwj&Vd9>4^mtmQtkcP!1uK|7-OyN-ka?;{i{bB86@m-H-;^={RS>BmxzfLcM9{YAZU0-i-@#OZY3 zJ}m6}ey`nQ2WQ)TuMVo3=T!*4Ic#M)#mi;!kB@fOP9B|A+}>lrV>Wf6wL#>}lij%i zkK#n^|1?w!N__e8(C*sFg9Z`W&i4Eae{Jgas{P$^nt!g``p`vJo7p}8JhI<-xh4Cp z1Y3y|59fz%&dU!6t9~d;csk|#5qJtZt-C5g@#q0vNs-VECaJEX4gYe5V0p~AechZh zOt%ZmgOgAD-j947cJ_r&m)42ib)P3JePRD>H{+9q;w3LTQ;*w|t(sKg*>*6E z_nd{o^u-=ckIhPcek|csnN+f_n&Gd_Hc7>a4UY>l9D8POkSS#^SR(iPwE*8^C+>TN zOAd3eElRlg<+09Rn^k9TEI9H+`ILA>&U#4(y`6=}`tDv$&W`z7pgB{9L8!B2E<;{L z;F-j~vo>04H;VE96FUTIaX(nbzx*w0uAO4blPl5^+)JweB(>;BuAH}L=4wPG{A~8$ zC6-fPo#fGEnBes_z=KioG>faKj$b|R!rk2OEex3EA!Z@#$|+E~|a;E(ySi2G})WmJVa2LqQXgT_>b4J&yL+Ohop@VK_-(nP(oLv34) z_FQcU_N{R1{X0$b4T}@U$we0*IlS!=RZh`dh*anaIGt#631scQ93{C&_C|1P`V|RA zyO#&%Y2_F*I4Cu)|GPu_n3?c4slfXT4CZ@3-@f*7ikQV(K$( zY&ZPnVrYorW6-|wW%bXXo0BU)Ze-V$6Y+fT`oQfnh61z4{A_Y^&~wnxDlZS8_Q?Z?%%B32(@;BS^IcdA&O_@-|5dg1ET zg$G-w#~)f4b>}T}!&}iEvMsAv*k3<*Uvp#zcguvOZ^`O`OUs^jExFctUH9eTK$E6u zyE*yC#AI*ndHG;%jb-(%TOV(y8%p@Imj)&<&W!Id`_2-Ozz8kWLEX6&$HbtOA;*l_ zR?hpGea0tw%ZWR?A|qK3pZTHHW%*~yi9E~035&TN?)&oCH}wS{!+|v3eeZn5?XnKP zRI9nl%&`A@lDB1)T-ocCo05AZ=OoRDyuXqALe8G+n{%Pv8>3@t=l|%OU6}fDV`NhM zg`GzYqOQ8#oYMASlU&)!Fz>bPtJBtp&g9BW>@#ZpBcwa+@M%eQsaGFE`So@d9_~(% zzjktAh?3ONeozXe?e+TfwvlyH`lho7J#}EgwyEXf(kP?- zFK+Qgb}gH>`as>Kvj(?>LLIjkFzrqJzxKeEC|5cEeIegcc4lsQ=x1Ra$T%~)`^AQn z2Dj!+ep|7txdK$LJqgKMF~MVtP-on}a}lALv-g~vIdyCOob>2uJ=>%T@j_v(IN9vw zyN{}$o3l1dFZ3>>%*x~ctXdB5xX@HCgFLj5Wo)J)FL*61VdKRT*7P?wVr{n_3+10a z=_I4VM33v8F_zU~OuBM^bX$bY_PjpeEAMxk`&Nxn+=tr+hchO7D*klH*zc%b4XcDW z6pMQkx2Ue_>ioR6J+{wyUgu{{#V3YqX9Q(_SC!x0#e2V(ZI|<`v#(BaXPcU?>fN+& z!!yHK?#oVJ?^F(pDR`J8oMN;mY1VtTi9ZW2^-UJen-N%Z=T4MM``L5nXCGyEn;a@3 zw3IzM7}N5F$O*Hr~`*CFjHK4}8IYlb^{U#u*})d@7C0vIx6-<;JAo zxh-^SpxIlV^~up&m{#?6JuBDUCI0NES^NTX9iF4l_e!=*(0rox;)jkvx9YmMJcb9m z49ddYdfJQTen0ipt?zQR-tP||b_nm2PL{~6G2m->|GfA18lld4kH1`VUUyP_eoEZ} z^EH~QCyKmO6xRSV+s2)uKAmkryfel!dnod&a!zq-xCh6~TJAp^ETztB* z&PV;`7S29abl{2A^m8o}*RN!dNw@JzW!)UKIwb6de=5sKzQaWaP8L?Ji?E-?mpJK` z+PnE{GGfZR*N4QaJ`2>Sta`H~^6L~Q0haf?`y-04Usr5(GLzPg`DIs>yqb|c>*3o2 zS(Z|37&e?`U{F)`yOn6rr!C*xkh+m+$3;E{<{GQS2A{SJk=(Zu^Sm~e7UdW!OgvB~ z9HN?>y;J;{ru8mnixk#|y;mLn&9Q}76G@uyR+|<1f2DMSb+1yES21%~YRFy28;+ z3%7ezcVbcMFMqZySE@|(_OEn%hVP>FKR;*v zytVOY`i9oihmOl_sR&SMT+f_;oAJQS9(#!o*9F$?C_HAkZo_6tWhNid4z~?=TN*X= zb}}A#*$~q8DpsP)f1!k&n?XwNt4(2zjB;$Y?^-^DIa_UGXdqCRdWW~JoTvNf-Tn7} z9@gJ-URdzV@W~(dd-EE8FIs)>+Jt#Kv;8M4Jb3AAJ_`{#LZZ2f)gulBj?OIW)SGiF_eCyA4(ljcQDE`KCc?PGbaVn@>A=jZKw zZY?#7uh$B+(K~TnQkVbz?(}a*PhIENU2QKKo^$5SzN4Gg6s|s2c&tg(%w&prG8T8G_-LBdTt zR(J3JD%jX zChN~D{wU|TP4`Myf;L(t=m}lDnTMAr1$Bk$VEl+_Mhi(ek$_E z?9ZG0?0>rb;=F11$WYrXBk{Y$gC?{{_-Zzy_m^~~`a9Z>N0uFEUg_j}U$YcC%Cwr2RT z+evhN)Z^y4Kc&upf4)vd=&Ab6X=|n}x&7yZ!n4e;?|;?zFa2k`O?PehpH}nCYqp;* z7#`(ksMIO`FdsHobK=ab&-Ujm*RS;ZBy>1qBU9@Bz|gm5Q>L%>4ms6#o@wJhmz!y! z`Q&~o>JRG?Bd)xk(CE3rEHf`Os?}6*}_It_d zQKz=A_`7}9=dEi$tQCk}bUP?)XK?uEWx*1HSI)0^^=j-7bw<|trQb5=r7 z>F>u?UU%QraU9!wu*9%Y$5ES0=lQ-ThdJiyu9ckoc-IBJdveSQ@n^f-wLRzk`cWs> z@ZC*3d`-QDy4kO+eMgJWJ^x*KyHl*b+`w?*;X8Xg0^h4TdFXk+*`OJ%+j~@KBI7=n zspql+eycC{Q8NvfR?EyPQDAe}qpd%^IAY>F<$Xssy`0W<|3l4@TbrD?+(P$;-77ko zZd+t$Bw+mZ%1*rsWAQn&#U>rUnsIopK~4Je-LlYvqmeT2 z$tkm3I22nZsCMYRpYXINuUf$AM9l=RrE~wKeJs*rcpTRIV}Z-kHII643x38l*T{zd znzITVn;RQ%=+}Q0YS?strHwA{5D>QkC^Mj-z8Z}AKsMnX1R-o$hv#k z7jn++t>;i|)wWr6;P#KQtq&hQJn(bg@~`J(8}Dsc=3{y?=;XvN%u9p#7UWF6b@`IU zxy0qa|6Y||^T%P$-&xK-TXO#XlD)hpb(zoCIn`2kw=UmxLS{{qjumvkY_a#GnVXOB z&2Gz`HI3Wu`OUC$Z|7^?lTAW5hKcna`%xFS&rhzOTcYvN!?&IU6On8gp`Tv(ilJ3tL{kRn{lZ3+X)A&-E%`urLFUmusx#rq-*QT zJqrC()=zTUmbyhXvSQx!b<@)11eRS<0S$ua_)g*K(DCn?wvJcG>BJt1w~A_~uAAq4 z`WLc|ZFh>}J4A++cPk1kK$7J;LFhvqsDsSqw9fs?UFYutYZ(m zEp<|~E;}UK`9XF*>zejU%713YU1Z!KTdqEt;exo|@wMvm9F6Y+%8WmSOv;Zg+UD}) z*9O~}KH}T<*ySDmYznFFCoI*!>MYL2shD!_C2!b!-u=J#=vGwU`LMNXtC8c0>ZOPN zZL^f>eQV_ZqSsh+Wr!AsKy{F-QquIEjk7=MoX$EGvRIK7oFyxkTwE7Zd+>Gb!PnpG z_uTw=GUD2$&bc3p#7-~L4F3A}aPig4GdwsRZH;$2@mND+)q&E5cR#cnZIqwk5x#EP z$t7#+za4*ExqGeUoYJ6`CE=yPH69EXURp=*z5Za=gX))0f8BCEw{Q35Jz=-sY~fH| zVGyZ&aYkl!WQoGFeI_?!cRkIhYGl0}(dE+|(skbY<4NB)>km(ly^tv{8?gX1prm}N z=HASCVH+RMduPV%ptbeMaoP9=v44riHRfWSZbtGxPI}LOHHE+CoAv9RYu3G-TcLNC z+*%=!f5`Vz$nA@(jxDSG_wK{y{db?f=Q1;UyIF2s)s0oPZT3@I|4Eg_f3!T;)17%D zJo?(dlPQ)7S!GulZv2TIrJO?`E7>gvtU&gXD*MvB~8Z_360=+62t zujk(h{Wj;+$G+4_hpw-`dH8?N+Q|Kf%kHH9TW%@6*U~-f_67Z46dE3<9k0IL zI^$O2s_k=2Oy?Ob_g>@j+qC-0{E1)v-(^@`4Juy|G)Gr6>F>X17q&l)|L1jHR66^f z$N%-*_j@zy<7dlSPFX&w=JurBstmikj&fYH&y3k$=YF$T>-X))W;XGYA!CJ+Vj3G7 z1e~5l@7tF+`TO!!w~`Is>U`f;YI&}LD}MS*QQiiw;Jt5GoX*(5)PEu;uA=;YW;u`E zhRrvpRMp(<+r@NO@u^i`s^ZkN{H}{32(jw371s^(M32hUd8O>{pDykl9a%6_uC! zM1{^jeUlh);!O3Eg~@hxg_ArTl@c!-%4;9|{@L{RoPYXGI^3V*CO?ineRx?W>ST83 zV(G5WzYo1-@Cp%qxO-#BD)%|@+dNZmg}tj;Z)&J=MRv`Vsnf5?6}Y@}^|j`G^j!C+ zgTV1^9@`W9bhrE$X%TQr7&*WE3IXUBVeA&8)`9C~8og+3x@6rkdTa~JNPSoUT z*JvNv|G)8FH-pLS?5h2I-MSlPOHJqIz5Tf=a&x4td{1=$obPo~9x6gcGp~HN=<%tMcYMxEzq1t0^ixf zkb_&qMe>vNSHx}?IO7(=cs}{8)CQd+Ij85BF0gMqoBHD2(b=XqVmnXEwfqkF6d$1R z;PnAvRR-kA3Qqa>qw`j63>6UyJ+SG zd{5TolNQrAuY0n8wG#8j*Vm=0s}KA3>W16rN%YDkL{7;K3g4TyqH?q6wy0B|WoMYI zYDis(r$zZA@5znA@blr~vGP@aV;AzxPhQ8&Eq1G(%ZWpAbIZRA6H~Q~S22`)a^{HC zdNI8=sP|lAul(jtf z_};8MWSrH*Fux?hUv!%!gTllaGeZTOru7^Sn=`YqMfK(`=76aQs?0lU?AkMCE?pb# zw5EOakAHm?dyMUFJluK5L6P$s%t7kL!F#@&Wmr#6aW9J zw&!Os-=p#D*x8vvGi~;|ePmFW&U~P&{qDcC6w#ImtQz-Q7bf#sWFEIywg~86|5t)B z#b{5izq+R7>mzQWe9?>x%o`LL^BR*mh7Va3YX!baQs1SWYe zu#TyJQgipBHvPg^qNR7EmsKg`UG`TvCPHh9qiWYXM_Sp__PJ5w|%fiYH8rDej>)gfy?m7AU~ z*XB^{KJ&x7wq(v z?FAFJ#(t)g>4LRACwmrqZ*37UTFmv@!Q~T2o%EW@#mku6cZT`Ap>zAED3>9v@&%F#M-Fxk|bkpCcYRAwY0ZQk>vz1} z86>MR`Q*L)s?w*e_qa~!%)ckPs3-Q~kFv+>PQ@O)een3+*exG8new(Iv%GkFl-+O5 zv`4wszm{gOtX>kqcqfCsfl=f3(~1#Ei0I<0SUg*!MRZ*G6V#QkCx&&&+R*lCKzIfAnLxVG=$JKZYX z%M(2*+WmykC;88J8;%~i{Hii#W`#|jZO+=7wMG&gyX=d)%`Z0JXKSwKWpzH-{al~v z#mDa~`+3Erf()A7iurw#Bqml*6bkKpKkdB1t@gN>4-Yp@%s5hYBI-rQw!@E4vG3>Y z3cj{3Kx>M4w4UDI2}}%~EI!sBUh%~gCa0@19W2RXU^ti7!(kArAa$@zm~GLHCu|JM znS(S}l_zTOp{|rG7dxgrzd2OENo>}2Ekl(BTSRgz>*oF1$Ij5oRD0j~RH8&hV88y~ z4{^uqxbGD&%YW`K()+;8de$2WuLm8byI1`!Whgk+r~Fmp@`G>X8kZM5l<>QGJZp#e zF<$+9+a6n%R-KD?e(~;*HD3?I^4SG9x_+@~Oxba%tNsh4gHqq#v^)R!-kU!@tv6@G z(;F>1leZ^63KQ5gr^0Sqb(EB5q*4@ajxjmmtudfkn6-1qiHEDE|NyXMsw^Wvkz`}Tkbe4iK^-nt{K!Oo!A zGU4WQuchiA?XJ9V;fPF_A#(Jeh|l+?bM>d^Tc#(iYuZg-;<@#ouLH-Bqy>U~!xv=B+%jBWUH6_0z2HmF}=Fs=j5@q>#Z@;jXgi z<{H5^mX#r^LbUGczH=x)@O7c~CHch2ZSNfB7S0a5!`ZuB>im5B{2N&x{@k1#85a|K zZJmHP=RLk}cVFKQ-MRW_%;wk5;^#j<+ncsD=;faSlJY&X4b_X}?Uz>^;H;Cb`?lTm|G)C(E=JLF_Z$sf z@^Ag~!X%dE;hy`}&Td{iPq*KuU3>iT|Y+Uy>`M zbe=nvwD}Z8>BuKIacz-Vw=w+`mrg|3ZNC#uE<3r>B05*O{GGGwn?tU{p6ZPZPftb! zEYkWI^G#x#)GNO0u_dt~_G`bze6zS$`r+@M*UrZg1V&U8(a`SJx=+nO~*9OaE5itvT`*wex?jtE;(M zcIDZ=2W>NWA5FOWXV=a9Ps6pQoclhfe@*X%pI1LdI)uk*gO@%2v|3y^TlDaU@>U7A z(`$VEy;5D%Dt#k+T^3CjdD$Di_F%xS@97Jyj~Lvlh>?h%cG0Wr%dAba`p&CaKhQ7_ z*mnl7-;9y| zV>V}N(Cb9;&675r(bdv!3@-a~p8rQPWBm6=SG(M&ynoL4piTU!%(eBBvyCriRaz+| zxc=+d)u_=>BGVkxC(8dk<*I>~n*aS$vG$@#rx_Dmk1f4aCwDb1Ct%TsytAy^5+|*V z*fNQ~<(u@&!yd4y%3?Ke4Sv$dTituHda`kxF^GRc$#~Y`1|vyipK{pYJ5ijQ`p0#Bq;v)%?KrcP(D?v;?1TSRFAfb?^MD$tRb@=(%gPUP?C> z*9@J0>S+K;4g;&)zkiC4|CP7Ca(?BOS+g!4X!5cDzuI`}tDg_+*JYcnj<4ETH|YS=VQ#7W z;*K9T?zd)8xG=Zw)$cXeH*C$BRCbL0v31s_zytc%#Hsn_oi%WR+O=Uq|Gh+Dn>$*?|{>MU( z3VUqk80WIt=2aBl>%D#O&2%^O#BH}XRJ6QzE1U7^sDsi~x773DXN5RtTTTW~b)}rF z-t?tnx&LDIg#Dng6O$F-u&v9rM7Xa0TebK_&(pQm1&y83V37uiSm-fj40u2o-d z72f!Mb3@|lv`J-dY)MTGn~X%moOU|q-C4${z@sYM+4720m7%jG)PDJ-^>VNI&VBy) z>#*MU%G)h%6I$P1<(gCe@G_st4Tc9lKgpz~7`ZIY$Ubg>u^`6k@7Dc!Yz@j`ElmRT zR{t|**5xuR65OB@#$bMnF`>b~ojWD(P|o(mg|B{?1gu*3$ig-}r)2vNh8OW`SP!hd zn0+eiP`UE0``6VbJ3aH+cz(`~%SQ6Y*&iRv4fC8Bw{zj4*@E68FL=9GUzmFR82jT# zXU?!1KV1!(NIhB>_096AT=mZ=oD-cXx76n8R7U+h#Vfka&Ae!CA>)JJpgCAo*DBA6 z_x`vAr{!*2tatWV6i@P(6rVN0KC%tLPU?fNuVD)m(5tSO&k zvM2p)nP55j-#y;t>o*CK@XHENz<#yiD(7bfJZ};EWg_D-ARuRg*I`501=1&KS>ugROkue&R85KA8 zEaH;Wy&x-~zB0t>*Nq)lEq(@lDlIxKulumTV&<94>P7c@`E@qT-*mhGCa=DP&2(F? zrH@`cT|Mvgyr5FehD*=AZm-`Oz9%TrdS>D55C4M_W~dyVvHGmm)Kh;a?q0Vqk1t9$ zT7B~AC;y`B3TN$(VT~*-=(j&xF}Hisp;WaBb)jxmt$1Ufm3uO8?@)Z`yZ*(leLTMR z?jQZqrT67}!M^=9yPjX|oZph5(UZuskJD6U-J8E^J&7#)c{l4sFADOzbS`M?sy~%m z?*-ic`0_@1ul6&kd#gZI-L=Dd-`)2uo2)AyEp=%<@8VUTZrn5$o9PqvAZ&8$qWSL4 zyvwFvxYo7z>W*vk7WZ6cTq$yOw}A*dL%jO8u*Xf@`ukg)x9+%Y{&%bV)`cqt@7DeK z7FqK1;+2lW{o>P}qb_iICo|h%b#BB83(f2AN{>9A%bOn>^?DA2m3=;&!2bJ^FZNnQ z={!H9v-_KgXZMZy|F25!dE2ReseQqZggY54axL=uj$4OnrRLtPEZmp1c+=(kHim1o z(p4F>e7@!gmjADN&j0_i99QdF_n4dBeb24#*L~fz_Wk?o!ki1s?(aDL#Xp`xyU!cQWn6Y@?>`KKlIU=KY6nTYU6+i8SSF zCw^<|a!-K|pa1sld$6N;dCl{v6UDQpypPFV^*o_v!pv0bS4R7CSOWr6H(#+d#F$IJ z$jqR0G2%Dx{=FwBNeFTM+}8F_>fI|o%X=FWSbUd9uW66v{Tk}ky69`y`uFk^znT5t zynk&M|FO5~cioz&GI4V#cJuR2cQ~Q5ctw-svG1Q{=a(LN{4vEy@&%uUs8^>8Q(NSM z?IFk6#aRA}h1jk=WWeG$L1d{h%Mtd+2Ll8elIAigGaOj^h=Juj%S5lEbw3m*dQ7nk z=2G~Q%i$1oqHmFew!Lu4`PU3PKrR1B<%u#gAD%oj<0FscY5zydSs3z4@BMzAeeH#+ z&{~&8U&~uRO`R_4ZP-+iv}xYfAU`gL86VyX7apDSOS1KUn8AqlJ&pf{R>n`!EpZ~tB&}&;OwQ|bW^46?-IYC;fr?wUq?pu2?_Sc+K zJ3=RK*4h-nbFBD})>k%x{$z{RgBDSDH0oy5D@}F!k+{PlRg~><#RQh)j1GqFV&-g* zCHxl7KW=&bhSFkYhEzSdchb@M&uT6PO8=_lSuW7|Aj3`I_K`^|MckZE?P5+Yowo_H z%4JXDu>_fq7Uy;rES5d2DYO0Qjg~d1xHFxfh3WXsI;*ubh|gjBPLqiO%jPbb{=WbB zze~42Op8=vJihVS-j^p--uK3piAI0y;&V9aH~0PKl3$FTf~&Q|#UnhQ%&&QG{;=(r zSK+>={mZ6#+xfhDl^XrBSnDZU<=ul`@6X;l^Y+wr6(_MRYqS+ibSGrqob}z-|FY1G zX^m;&bC+n?79Bidyl!8;i&K5~E&s?JNqpLh@zekDU;SNrq3X!ZkDblh&(y9}eq7Af zmmI3KG=lT~d645OF6n3{sk$aV_d8L%PIXoVIAuzKQl{h+i^rK(x3las4fkJs@}BGF ztJQzw+Ygm5UY47BZ0)SJUs??JW+(5pyAgV+&tK+QRTeP}w@ny?I2R`E_S-e<^8SeEt+xd_KUv3Zz1UIFGQm}6_3_7_tW8x@ z%+}0!&!)o~HMi_b;p3BT`Lnmb3=wu)5Vl(Oz16dgiL8=)i|2T?{u4BMZ}$D}>tMTu zGPSW1f^*(mDo^B4fBHuKEyI)7PoC|4cB^*ls^y{Y`tMBLt$kKsdg}S9Gs|XOIlnUd z-kMB{YZG?1t@+e{Gp^I6=;I&P-;ukcpQlBJtqifNoBO#Taz&$B|XrGnuvX_RO86B&MBcpK12qOu{$p@#$*` zCz=yO_GIn-5!hTf`&hkpNcDkzi!WXKxRTi+IJvuI>y_f8>OCA1jWKyoe*SrURKV$( zbG*f)n)Rli{Nn`VR=@UCkz!VepDjD#$nhT$I*QY!899_^)TsW{mNbvoo6hZgD8uaB z9l3c|Pjy@ND9ki;yEJ8%%L%4QuV%g%oA6QM?c&oqiC-F3`jabbYH#!$lu@5o*lGS} z3RmQ{ply$JUo8(&_1B)*9b%PNaMHu1T(#fep^4`Go!3gv9pq3nR=FU%&c0~hyM$B= znarIJcE8A*u>SE8LEXKeT{?RsdfxZ<>M6ya^-|Gc@Jzh^0r!3@4t-FqrLK z(=heJ7L#@LMeT20x*y-&CA+NZcjorDJ1Uo%O%QN;7JSXN@5}+FU4I=t4r;7Q;QF(D zQ}wo~cHvsz9-lWk`GCXn^m+S_3r-q*Yj-~{6ngSSchSx}#WyE!ZF$;ov`E4B)|Rgm zu2!AkYCE`8?D1i#O=iZM_h@8?Pg&u0Wcgx#wMw0M_42ukMQVy$nYiVgUj}Qv%v$;U zyq)jNRU1Be&GdQo*CgQAoruc!y!AgnznW92V|@C>wkPkVDrxD5@3#BEw8A=sb3sjU z=5OBm7x{vBr(I&Yz4DGizD?%6M5}2v3NDLkaugQc4B>M4-t_BL>hI07q&D98``i2| z`@`LVf4jFHd~nstY>t3Y`Xqjqwabou^qYJ8s=%M+{N&St~0FbESNhK;r_H zK9=Wq90_PRu{R=3z>?woQ@7rA$BGWTwEF%cQT4LmLwnUDN7#aUr^?v+o+@7#dcsmd zF=bkY+3HpC<~#H&tC_@4Z(s3t`Q543rH=#`LuSgwlDU7lskt*K*hxI+_DGm;vh0v* zw03UA>Z0rO)V>;Xo&L9KWge?yiwhFJqx#=%;!Ggv}NI>wbLFY-mtD*B69eGOYpwT zH2a*1jCKh)@M zDtpsnE%eaZjyr;XDLaqZ-bKs_*6;k(7#HZzkz1|t(}AO;Kl-T3RE?>hHu=6T`dyyIx`Co4KlLw2f4k3Rv+K^A z1c}^pC(G{eDtz+4x8tf7xRbqfQ&P!~8%(!t_Rn_Xh;)%~i(a&9#`~}duA0v!r)WHv zoLo2qOc0MVdbMoCq!@y3jmA6)8WR-mWyXSw{ ziZGk#zMW!9-VXaLgB;z}wh!KXuzIrEGP~J(bL858y{le#Pk4R! z+Jm_T4`v5sM_+$3)g#<{@%N-{i}lv7D>KR4E$}uMv}^16bLg(EKYJ{V_p2$k=qQ`S zFez3BgdBWi$X;G1UoTqnyK?2C^0HlLuC~pdKj&+C>oxnG&Po@f_;+i?Yfrb~(fR*$ z{g*RdYb`p3YExEBDP{M)b^m(SsjMg2 zPoJJ&{dHH=(xABT_?7h+S81=8)tzY>yw5ML{KA&QA^FxXvuwT^Fh29z62IB~pJe3! zCwW&^&*k^;TW=aIKZh_a_#3tOgTlGL zUi<%@j7>eiQs#XG!;?JD1M89uo4)!>U0;7c@Y|eI|Gw>TSPe=ucc$08(K4$spY?v9 z6L|UNfjw_~kym~)tf;v9>bH0Pv zlgP;v61`n|@V2;j$f;e;p>zMG8LD$Bw&=J=UVo}_qG3Y&j4M5HtJHR$4YB{U)6?bu zk8DByHD4~CN;kWA{OG5f5w|4L6nV@~7ydf4JUm*uH`?^`RS70H@B6bd7dHT zAXe%2H?qGVy-lvD?VXE((v-h`Z}Tz*gtvD+{e9@|V*Vq)b|%$6Qdcys>sArc4cqX& z{>_Ou3Z@&+T3$EZ81YQX8#Ie-SXlaR-Gr|bluOi4ZCaD)9r>I0cgelJNT>MEtQnU7 z*XZBnPq`+Tc`KDmf18hP*ZT8HKj(a|iP4(sp_22dG2rtuS#6cY`+u~Y>2m$}_voUZ zT$6Whi?BP;BGR$$ygo~0BkPyG2~S&!M9=JVEnnb&*5z2!@%1e_4qvwEv3;yaf99gd znzHefxS$Wm$@Nc_%B7d7CurgWvmBGl+2A{9YSwso9?R zB7V!S{XDVX&7!`ATiwr=l`T%w9cwVWm&NTnfrMg1BUu#M?UVd)y_KIzlxW4zvB@7IQ z1%B^G?s;dtIjpd3VmWk`dVgJ=(dEX<;c(9Rn%_)+B{!&Dp*;YI$nu<0+yWy|><28kOUa zHL1u|CQ5X9tf+O!QN9&N7)9TNwOV8-^6hGfT`BOHD{He>Z?JA}@WpHEw&nCp%aYaY z*ywdMLVSzdU6)h8k4qdc%sI}<`Lon+mi@8xbN$cH%#oZgf4)+#bIGjz$HgVj-ngJP zF=Tl>OTW3t^voaCHLrXvpCw1i`eyUo&V5-n@BLFHeI`Zj^EVH?O6TEO9J%pUgV3(O zlkaZU6>M}+5a3`rl%%v=m6<8A&|wP~$IcnkjwXMyjh*l$U;1Q<(T&-&zRP#;g=lFX zpB<+nz|peO!GwpSMd^XXz3-LlU+UVnCDh$k;Ar~(Wxi$xBuSH3vA`PbRdUA|h`#j*_dpD$!O$=&kWY-LY=hPFu2W9ce}jS;8Z zUOQ~LU4L|9We~&n`D?Fz&t`vrWP4tI;M)8rd7mGro(sSBBje`+4Xuv>9WIMbiHnqO zby=;zzO7d8?rJfHHmlhu-^`iy&C^clzH9Y*R~h+P20hyj$4=X;mt8z}&z?KgW(FUU z*Zi*e@bmuFkKZePJ8t*OR(!p(W#z=XZH&JY%a0e%uWG(jzf$&a@~zN`U0z3BjNe^h zDwyxLSK-{^yvurPGrX+KB=}=^x0cVis;^o5yjnL*yrD*4yi$+jd%)M!xsOsh~f-ysT7g-f?w!NZai2XE*41t}U(lKk)94Wx@@wudEQwE0c7+EW)r$ zrM&2!8T*0qjngC7MQ)5@Z`dt6-=Okb!8^0`oQ%oq4Gm702Cw(meADjp|IcyOxALog z?eCM?X8v6Gcj2i|6>qz?KJ`_5-X&^P9-i=srJLutp#SZ_^?w(f{NWb8!8|EDZw4qh zQ?yg-<}c1`5BnKy+4gXM$(FqKu-%cY3KIo*>O;Jz8_t?O`&HcaV{ALu-p+MNo@x+z zY-_4U-J<*9q)U6Ty;DollT8fMgO57Tko<@0R+ z8-tv{^0ElVA9`$!dsf9hafO7PgMz>_)kj7F&)%rcJfL!>z9a15o=2SPFZhQSx@=5% zXlV4v?#?vPYd_qS8NQy*N^UkZlgQ4=I1+Fw!|_GbignxkVi$j#^RZ=JE6;7-S5l=> z`ie4~-Qm6Y5|#7nFO@0^aD1M=rHZl9f#J^b+O_f~HT8RgZL;E5cixlW`RdNS+>39y z-;*LShpXME8b7o)erVnO|JR-RmoKiUT+Gnj*X>x|u3NLWILmU$#M3v6>H4Cx?@MRgU)SrF9J`#U zkKgx=R$A6A^`8l;K3<$#Sr{UwF*+>0#HG=?e6{JP!wcRzOn+GZfm0F;oh=Pa@Q_SAH)(5x zM;~i}0LNwTY3o@UwwNEPY0nT9;4<3V#rni~=Y$C-H_2r@Kk3JCP`~Njx;K@2_fzAS z@4me4{4<+(JTaVee$Ox7R%`ZM)0|=6bKPp4W3k5)@&n@Z%Ikd8zHqV}dU7&7y~iQK zgk`-O8~fvB+rLhIE%GSwPAbC#yQkU{ywoQ1@g3WJp52h;YSq$Dtgi2;3ts2U|KVox z#rH_{zVfU?N7x>VxGrS5E8fho!}^c%e^$1;YTnO08F_B!uH&2kzvx6-DdUQp3uN?* z8#irQ4wy}s-Ax1Fo5`Z~33Ys{UmU81WLe>6a3NzltHuXYCnt_?SNb7`0V?^UZr zO!YP2w%~G zk7^r+KIz4mW0oumns~8i{p&!c>xKF6rwbMrzpdarY@WpM@f=rbdJG zi9J0Nk`KykzB`MfyFo{ldC?W88SMgVnGU)5EKXuHj8d2>`JLT(%G(x^zYfvSQJJ%* zt(}r6aZPM>#XJuc2A2I?mqgaC3uL~KccpDztJz3OOO}v+0`qgIkZz011^@1&l%deGceK@uHtZ(%kX7l7=;bnI- zh1wD?L?<;D{*_%Pqp2*vOE0^yt{f@R_WwNk*&wG=SS6w8@!tw_IBB-W#x0~<~PS4 zi&(QxGh_af;FmKdy!(9cz*Ud);&1nTc6^w)>3Mfq+d{e3b}dJb|1jfm*d591usna8 ze97xAzB4~|hlFSuN$u{sxG!X?2gfh_u+D#iE{p7szHPTzm@Rl(PQ9URZj{3MEKsq^ z!qf<=p;}r!{Xi8|p0cE(SA_AYE&AWjUHi51hvn>Pi_%wf6*vA|AG#oFy^ueP;{pvX z1|iPZ6BqCD-PQQQp*FYnN0r1R%TxarA49$=y-s9{pi; z-A%8VyALm`+^KoDT&U9Z- z|F^A}Dba1F_7v$*dzZxDmKXfX7F`mUAHu$#&6st@tgy!a-u3S8?f*CZ=R9q%{6zBL zuk|f+-1q#w?`o*yG2K(Ue)WgnG6&ZyOO*=CRm$qcYjz*qb@}6MzB1Rkj)g3*#HX%p z_nGQt*>GX2$Jh6>-`#)T`A5KasVv*pmLNOr?eFq0PiqU{r_>u>jEr%JgPB$`gX z`BEpfz)PdJcx@`b;i*{%Yi8C*hUoBoZIZmKHNzn79LGs^rw6AuB%WrGU-a>(z}lue z0&ANrk1Ac)Qb^e}?c^+|FakUJMQ!xBZEkp6gh;l;iU0Jr(s6zl&~@FWD~hB4~}Sd`Feq z8RaYTqH>>J^-h+!?xQT^S$eJ@+q?Pi0>iTI?5g9Ef2^7k9n~h^v^Ti+_JW_*|I9V9 z(^i;DPnlU?Hu-E;+JDK;Fvf)$9bt@#ev?y=HJC6T(s8s=IAfl6y_4Z%o5P8dCpc7u z(m0tFYLsnOE_ub9#qe(OyD6p@Z;15jo{zLiXIj7K)|$H^rQhTKJ^BCbYt6-VXJ;_) z`d@thM8N$M0r62w7yPa%SiSG&4)6N^`~JV%|L0U`S5|1U#iYmE?)=}Gp0ecq{Qo-^ zM6IuRdNu9;R3|ezHIc{v{+_@3TKjeRmPC#}wso(+rG4IAs{H>Qce~Zr*{c{-CO5fd z8}41~Z}(zn{r&ZKSD0M6b>zvmuyPfl-M{_ofBdq%UKs!VXF{GLM~kJC9eWxJLqpQq zJ@41Qojf<7?_N*tRrBunB1mz)qN9}dOWhak3 ze10Mz-hYE^Kid*!`>M2%I;O<3!ufmw-YZ_5J$Pa3iI$10LwkMSTg-0=v3&V+QLN1h z)sScYk6%YIw7s2nApTdhea4OtHv=E**_!?oFRRK{pBj|ODeLYNd@em@Nxq@hZ9xu} zLn$X;>NTFp5}Ie>vbw>*b6KEt!p5ClkvFm-v$I>;or)wjS{FJxgid8zI$?cc z>FiL3miCh_N((EZ_!^dJKDA=q-6LpRF8e*|`_)USBD=c`_bx4$`|S5LPLN}>Q&@S; z!pr}Cw>Sm5PtS~zwKG(?BEL4|nqiMy?Byf(A2Yh-A6r#_e~J$m!;k7ciQTPwmrq=m z$oU;3}g+y8KP35p~?*(wqHDRBJ)S}p1fi$=le$kc~$xz^G56NEKZ#E z+GqFNq?a>irlj8ZUkbA8^3_+pzB0$tryA`G0@n^Um2cR4m6dBFZ=X7O>!g#?=Kqu5 zId;w!`~NiHXmKge;zF5^Kh`ff7km6u*?|fBe@{vKbK!iwrOLCzI@fpZW|FwBs=Y7x z%a2dO9L2)_rv})}vnW5tb)Zyh0^f9xRoWtK;qCpYr96v2&f$D;@!#(kXLq;+>2Aw? zXSV!y&caOI!x=i&F|CuuIrzW2hlci+%xqh>`l_k#Mv3W?_O*-dtq|eA_&DR&@)}-l zg{tBSQBIQOQYEuPx7C)m`Np^1&3h+yJ%5$4Yge9ow3U==U?ykqG#y5sgJ1e4Cz_lo>doCh zJGC^4)mWQ*fm5PKwDk#|^X1Hp7JU^@ikg>fiPAH_!N2s3AI~3&$y35MuP(9CPvDq( z%Ia`g^vAQwf)jn14hRJOH`;EQbFFdNL4zB~lD%pZ9ReHq#3RIbnvLffK2+-Jx_DB! zljU`&#UqB(i+YaLNmn&jtYb3imF<5s!_K2`VxxnCkGRXp1_N(U)91;|xT8%+H%{36 zL87#NLR!j^FUyw&)Ssxm6uWQ*hx;K7*Iz6rs?V)Uiaj2)Fni&Hs|$WF`F-+QavJCT zj-!t|Z(Z*)^;AE0JzviF^NRb6-u=}Is$kzx*KPGFHYBEf_AH5w63?xk<=$AiG&4j? z)Kq$kRPN;epI)d*q**4{?tl36zG>9AU3b)(bJ=%W?OwycR@bE}RXImX%L- zXB1vl6?i6LDY{?mn*EgA{lD)>MrV6BpMBM|@KhV_p|?RVzX11j6vZR| z&iC1Mj%^?RPHX?D*=uF*xj)~=+-jBZbC-W)3g2G|&C73#Kh*Sp{TtPNbEfL0$0c3M z6zm%f%wJkbuBeU8y|F0FCi-gG@RcirUa)2q+3vDKZ~u*`DG#sFT14f18>GT&F4Yy6#l z%TVXY<4(@`fnt{V3;s@6{&O#1=+sBQU(a2o<=VZ~IYehggtqi6%=`1M^3LPJ3w&$)G{girj6J4JVr(=> zp5i0Z>LAg-g3BOw{_>Y+dkwlLxLZy;qR+{2#wc?ihjv)T5#jm;v9XKKNXBoA=}P?2 z=@jj-q(`JdL8W-snmGYIOZ_tqdhX`GjO}-eKd65zckR2iw`Z@83#r<*=8cwEL)qk0 zwWq}2^jh>+Wyi0cxITqZMTm*vqLn;D8mI1)Yq<&n&(vqG%K!ZT@w1nkx^BnJy8rrs zK#lnCm8w$`yQLZuXW!azmnq`%#GSWe9_atQAOC*IX$^*Bb8qzt@2iPSb(|jfN-8x> zp?o&~pQZob*IT<^UXZCZH}Q?w_5Z$GJ}(L7G2gp1-^4QZIF~QmTcqMu!<<%a*ON+{bLT`=^Ne^ZB_YlB)XYhBj66JUCdb5-fN7 zKRzk*Yvr}&X6&o4hnuNy+MUvWS#ws?AC^NhEsrbiKi_*l{{0bwGx^d|_e-kIv-!M# zadh<+p_Tt9H80cro%sEMe<6b?mnFk2uemJMph2Ro>#x2rTX{u4Y}?kdpLYCL-(Gm; z9j9QEyM39HVt&o#ncx1++!hzyBPsoT{@OJ@x5}>UF0J;y+I=tYePEgB;;8jH^-{apQ09y@!lMq$00%l+PU z8+7tq3XHp4nCeX)%n;Vke(?HOrunvfUsp8&4*z*)*1i8T|Dnnmr6XYneKu{F9=`ng zu>(!t+cs>Fc2+y`!-efqstALgv#E87uF}L1b@?U763X9yQ<+?QGG)F+y-KVa>w*79 zZd0x6^c#f?E;&73WHEh#Mpt6d@tFZVzwN(osk?CDwzLR^;(!R3g&tVnUnnEEl3CrHjv;HaC$7@t~ zScvzlM}!^U1gdMMc?IMcFgnEPX{)VH>fk-bxIuff>6{%uW)w_IZEbh@#XNPkd)CG` zMQn#9{+9WMXhPa+o87MQty1b&pLzbvL`$_r$N476ZC*dg@{4rGv7Y=bE3;=6S$WmZ zX-e~}V|wWM$WHcv!Myc3Q~tP@KA!Ezur7FU_xCqOUUz0VKEGLf{O&V`A9~-6PMd0n zy=Exb{#aP;yyUsN&w6-sKbf+n?aX`iRkQW)gqNV^>0js2|JMT#e@ip8$X$1!?#SH_ zyTa~>J^FY{H2d^ypL3$xL2^NA;ntFqqkic!G8C?y=XF)%>n-o;f%oIzi|{|Y7&iH! zbzxVN#^Ea`Dw)~eA88EPrgM6MiYQaVvc$UZ7{TRIWun>IB^wKLTfWcwxJ~k+hF|GJ zXZEm-JI*p5aFw5C9I=;VyBH^$* zUya-Wrs7&}g)_<>yIBsIIBwy3rdXVQwd|HC_cOn%Y4aLiI4s??X+z}iMKhXzadp46 z6kGNwvbAL9mCu=dAEW2}D4OZ>>huR|h6Ck>5t|(&BPL%jH(XJt`F`KDq$3;l=Ce#l zEsfdNmTQ~Q^T%LDjRMb|o}=$oLiEF!0`f!VSts-VSt{>v^m5V4DO~qGG;g^p89wC} ze!oFc;F;>rU-v(YRa!>x3p!R<*Z2AJ_dh4uZD)oDb9wfEnIl(!Dk8+mE8Bwe@XCU+ zr8>rQ9$RE_s?JjK5Z--QQC#M@=X6iwvs*;giGardSPs4UG^2Lvmkato9ae;yu8Ip_ z+n^QDGuR3SmbY`dcln>W+3o+`m$%)BH<|ic%bh><)sYQ%KRi*L>6iA~ z@|>vG!ygx}6y8a{{a(yH_>O+7jN}55x5v+%TO9jtor96)hdl|m-}BW;7RsEw{ruVc zkK1b3J-9w`ar>w5r@I9gi@cTH*7tZ{LcU5__vbmBAHM%c3F3%(7rtid#Z-~qla@{k zIM;70;bg@5{^x>E+qn!Ef?5`W`JWmO+zSqt1{d-JnK!&G?>@)N zzG&l_)uLQGlX5GgSI^#kmUX?`tZx>KPc9b-)vjsT*V$n|nZM=2R*$ebU0XkWDvCVK zSgv#I=lT|%>Y(E2BFpHni#EO8AnyF2@?Pbg>l=c(8>V_P{@BmMy5247TklM{qPZ{p z)Pg7aCVyWnvhGUKfx;uo6GPamH@~m{essaARTGz)mdsq{6qs)RgzuZ1%A{9Yif=Y% z^ep>4>z91TF_lSKzZYI)7u2Sk>QE^R}3@>+_^budXProaPbqT=e|a zr;}GXIR4xuq^;C;IaMk&bn*XF5`S$DEjqO6`csQXGcDvA4frR5x)E(Rz5FEn!~QS# z`1CcjsBFH`NvU5)-xYMW1Z<6K3}UH1%gpVp^SDiqXpl344Cm2sj6<4cCef_);fXIQK(azKipHmp#v`m#g{Y82AN>cwMM9 zp><3E_sfrmqs>bo_r@>*8)k zhTC@GFQQ!bbuHBJSbAyZin$6Lcg34uI?p+9B`=Km!pqrj+3#BA2B+1$GT3nO#2@5(8DKWlEL1ov#K^l#5O6k9Dbgny)@T-@5@9E#iO3)W|<%T zglp<_k`uQk?B&we_?W8ix1&J0C*R4!e&XV;)Sy2m9kpgFRvX&Py|?nb%Bj;&=f=(r{{CS~Fz12= zmW>~_Cw_eK<^{_I@i*M{((nGQ`CX_wv$P|Lk>S9N1%Llsx|ook^3^yxbJwj+*F%3t z`QB=Ka%s8AOH-jjt798{YafQzXR|OcK<)_Gy!c)4zNOx#+I5S&YoyR6FIh1Ys(sr8#0rH57zqc>K)zO;1LjofqfD`goD2mJHy zdvLYx*Y#PV+9n$v&%O6vx$$;%4_9l=(fpFB`&XOqUu~Wf?06nPc5p zo8L~%U+g{qlELZH-u#r?=k|V>XYkjy>n4mH z_j*GA@6-Hkzft7w{F}+!lUC2ad8=&2={?KMYM1`r9QKg$yv@?czdp5Bty&*D3p137 zX4i%9551pb{UXaY#m9Zwv;c`?uhL6ahv%=2TE3y)z-@WfAurvEnB_G_Gq2QU^`wWD zhcDQ-?dXo+>i_Bg|IYtAH`eUvET{icKQk;Zn0`p^tK9YO^TD;h(jM#m{rmgh?*E^( zuWPOf?S0g9??k}-iZ3j;8NtIoEAk(>`zNj}5(`mSedYYbef9qyH)ZYpG&Ov-_=cp$ zzYC(3R;~-U;wvM{@zuRKJpFChk}vkhWVijzW7rryCvS4A-sKA=TVwJ*%+b8IEm$nF zv_$S}*<8IXQ4TZQ&pf?0@8*)1M!i+Z!4JPCOjK%>IlE`euA!f^EU+p`NciesXj-@cG3khl8ev~yjN$xVX*CLZT~ZukC1mj8RBem-RN%6lvL;&{{AcwE?DWxqar{ji3tt^AM7 z1^c$``x~+Q^Nz`nEk0YP9X50Rwd!Qfs)*>sTXUmUuUNg-_?^ir^Hql@Zuq=n@?(pi zQac|zvmZ7{nsm*1t*or}9 zH8UPerL*SP` zA1|$1V{PAi#*v-ZxZR~`;=Y?=OgxKE{;527d)4hFvvd7XnG6S4Ph3_m<8E)1d)55@-rtq0>!hF_IlwZlSu-#bUmr0qMpPW^h)EXULM zxA)u*?|gd;tNxX@b3D16K4ewzd-TaObj1Rj$kgXN65Aq@%7q^0%U?f`({=OLr012V zigqgg^LDDx`0{sa?AAJ__0B?`Ta(u2C|IqH{j!KN&R2KSt1n^?7hd@6y2|#%>C{iA zIZHR`eLDOg@Oj=*smdqEXC(1jn;t!)9(DZapY3+ivUhjhxurTOYvq(z|ISPlne_MX z#BGb?7-|o4KG6yC=v=bvPiEwA!{Yq>Bb8THS8R*9vY_gW)wy@S!bO|>w)Jp++vYFx^Q6(~dRtA!v`viODw8TdmI-tvr|dhEd|uo#eM;rl z)$I;5Op1TV>d(w&|QY z%JnxtbSajpt7V;Q+t1s*GKl-(LAzZ&ev%S1jy;=q?~CQ+^%I`&c|PZN%!k(tK6hN+ zkb6a8N!jFWix)dz(UR!kE09@!Z^5(5dz+3Y-OdlbzT$2Bn{)khzcp*N-v5{VSKMy5 z!)255*~N1Ue(L|c8LD%9X^n57w?_NrgPYbIe_dGjevd}))p_Q(0P z+rrA1F**Kl(~k{`P{G%2kF%=8uIuzy6(XpFYj_PVTzG z?Z!V+TNWkUSy^6_qBUWUL&XaFtecN}?sOzZtoWtBboXhkUC(^|Wzx?o1dFt^2jt6a zz9qHS(nEJ)k2Nok^Gl;!{&tFtJ9aazdpz&OS;vM+_PWwPE*kIai*&W_tB6srX)b^C zR6F%pY}M_3yAFl&eRI>PmYFEsEaI9Ozv|UKi*&22-TjvLZZQUksBX);nGk?|*sNuY0p1#2i)yCV zo=lmP8ob$Q>M5^}F+b-RO-v74VX#(rt%>jHuu}#++1;Tw;+wS;uFgr=HAbDU1ei|-9hQ{SNr$hyZNtk=l9heZylyftc%c| zJpHt>KUcu-Sz#3#Az{}_=bztTI4$1ex?%j{jlL4cEc0Kp#%I6Hz9myC)BP8Hgz#`( zMoF$|`qfuixf>5w+>f`eX5zCgd}Xrw%*Sih~{!hJfa+z2fn7L!_H;gx6iZwg0BB z`XyU-u~>`YrI9AXzv+fQkH1$9X!^K%Pv$4j&;<(~bry4W&Dx>&nXm70?fmbv?p;de zc($FlNulC=pWc)p?v zo$*7h9H=u-y8 z`|Z@J*7aI?=~|Na`~Bxn`$+87KP2rG_137%hO@F&UmqSHfrI*+3vbEZ6yW0*WpazZyW7iUo zm1&ZXxIpF4CXad{V^QuC<&z9T?<{Ak|9{)E@G4hB=Jv~_tD?8YMgCmlq_xy$K3hm= z*O?!S%oxO_@`F9*;IPU z&pYxAC)7h5o4SsJ26r-<#NT`t{Qi=m?PE=9vel8&Rn~j&oX}f*#MH^^JV*cTvy2~N z-=t2*EA-rum-^2+^4hZ6@u zqg^#;U6d#Cu)RORxM6h!19-eEXhD|T`n?}{t0$k#+`LQ1Z}UdQ_G_jOISt-NS&Khc ztPA&6pR84Ha`e`xZ+zXaXDt8dyIdh*Pm*Kfv)CW08zW<%YNvKBSKpxKq#(fYS;+Hi zjyE*c417DfSc`Mk&BzedQ3`n-yln%EqsRQ{?~$dmOM+JJIN9T$&C{a%@L1cieF5^m zmo-{5w|nl7yq}V{X@;)cdiC^w$uks>GWlHG+Oi{5?@KI4!)up~#g|uUiF!Twb0YKB zTqC}f_ZGZ+@uFaUiFCPCU{{2W+Vph);~&2NxG^_k>84FJp_Xlo3je%qCVGVY+a~1j z8Ec+-JM&%jj=%P{k1%uQ+ZmO z=e)GZytgWU;j{pTfUa-J&wk13ek$7b&2+26fu9@If21zazY?c0J?P1lRcVh`m^qX= zx*oXyc&>bPbG-XL{!+1-DRK|(-e&(@;Q0H*p0%Ho`@dhl7f`>YA&sr!Nx>_ZFW2L~ zF1mF2s#crN%>~VF*$>|x*==8ZV*a$XaeGU*#@gxqkDA`0GiA)}3Joa}3`{?S6il zp<&Ab)}U0g>r59{sBYQi7WuX5QTYCAH~4lO%N7;MxW^hN#_)~5=j;EwVfkCi>(liA z*$Hs49QxDncQ_lYrZ}~KkvR9Z;xDBZsHyO!a&8s?oMn>U z(ZYPCd!P3P3#*w)EZ5*teX&o1<-pyCuK!taj2;CrwYF^86V0Bm`rfr#JBc^FJNkYe zyKcz+SkIQ>boIIdl{75ysSdE?w*L?q(aGFuPVUAubm&yAY{cexDd~55Xd*9crf9xT+o0WqF zG9v(5b=Q5yFq~tOpi!=^^O-IGP9#5>f7#LD`_XsXoO74Os{IwS-8_f$8=G#mPVK^d zNAx>C^lo^yKSadUvfoO1qR026?@CsE*#7XCxzz7}x7?>+ysY<}<%}Wk+&gC;rWwpW z6TDH~MM<&hV@r<8RqoAOh3DDKynB4g%jq}&JZRb9YxjTmv5Eg*YbQLii(gg$f4BPS z>Baj#96jAKzfUrc0p2GJnIhTTdNQZ>E`ydx+l#Y5PI$;O^qb%K0y;yj{QuK*iLU*}qwl@`5X+}3#5vPv)%`_fvc}94 zJXRH}ofm&+_i}T@T?w(Q`0K~=i}#)X9UU!|^Sk%ukC~i|2B%Fs<69h z<28-nU0N=C=K1PbyOwEwayI!G5b!VTV%?cJdyVT1|F5+__@|^CuReI_- zexJL$IxMQNsZ{&6QKrGrtdi?`Qif_()HBC3Cj=+?V4WVF%BANZI!$SXXs<7-PeQtrLE)0gpqR zF>?Dk=hDB%x!uLvn76%HtI@VFL`(PVG@sYMgtJ9$+U5uwfB)~;8Rlqr5NF4((E^KI+0nx#5oul}&i@2cOg{>j;7YMI0pA+Min?(EvX@Icjh2a|9A!>(w@2XuVyR9f}5 z_iwzr`@i-2%THornXTDo}*@8VWY5xy|gs+~bA?UD$D{a=z zYg!6DiFp~K0?$~wf9B6M@i>%hq#rl`c;0j9x;5{63vadvcDV=r^7x(dX2F|7>EDAE1j`?;~h@P_+OKA)Gr_2Q&AuI zLbOcgqsjj37lma)mkK@ijJhqA^SdX>ML--OW9?esKt=PyWl?-@!|}nHQC86KPHP6d2o`R>tN@NH_ZUFMLSCm?2Exs}Txd{>I9u)Cs;MbRn|hJdx_#cBchIo7wf z?Y{jyVOjvQ{n4sw<(I3!*S|}gVd$N4_j&VI>!@3?*S2K8$_h=6UlAOlbHc^vbm5-Q z$?vt-o7LC7%vjjFM786OK=0j0M`S}bN{Ii|v$EU%(Urlod*|Xh_t_8sy*QDWqVaXT z*qh#rE50wcoLsWtVw9Ettmfz|Czm|1d1ZLzR?_xefnDb&r(N8*diCM!U(}x~UD8qz zNNaleO|AI-;H@fb3^?e>Lq5`ToL2VJ`D&uXT_hS-1)*a$FIypbUOrY1- z;@9kQk>dNG?h5>q+h1B;{98Tjv0rY^1nC`;v+osgPu~1R{iYv>(z;-~nLe-VuFg$e zu=J_J^t#Pfr;Ee(Z3}7m{k_^?PR_5%#o4*upX&O5JOC|zd2u#k**XS>=6#V{<4(qx z6l|}Yx@+P@qnXoq-u-+1`J-Qc&f0e#DrMj2|8r4V`KxwujcE3buqjFwiDo-x4m7JA zv8_lKZ#k_PTDoxSAN{Hz^(t98uEqAJ<@d(;Pk$U?T~%FprL(Q-kA<=oBMVdGh694J zif6tx-TH65`>3!O_vO9+4Aq{`JUz$Yvd)imbC%Q9dY^AsoxW$)wlJWJtM$&7==tSY z2^_xfEzX|hJ;tW%8_eT;lV9qpzNT*V+@D?vk;e*;EU90*Dz!eG(Q$=P#{Yn)cG3d% zRp;2Y%+Bsw$#~e{)>+d-&We^cg((jcjV5|%%$vr%Ak%B7-$A|PBi@U=96vP*NI#M4 z`aHo`L139+-{YB2t&Y2|e93dWZhPKmiRsTvB$wWeP~|wVLExX6*2Iwh?*ZrTKQ5iE zTQbva-?0a~Emkc&Q3zT(2U_1XH*>r3Oc92Zv`JGF|6jkz`pr|Osvj#|s8EC=pC=8X=Lb-HaA9<||P z?2d~$^H(QJ^gix5UawmE&T5+0qJULAiJS6r8ta}_B$YpEYFMSk>ZKTexa;?c(%Cx4 z+P0O-tPqN00UksW-WpHcDLo?|bD>o-RX~XmYlhRbPK({xrSCGoSWUENNl zB##9v9NM{cxZ4g&o@e>k-cat7Afc1K;eOjw9ud*Sk!!;rb};L78%h1neZl)^C)Wj& zGMi1Mg|iQ*$!19LG}}tfpExI}WAb+M#S=Uf_%0pIcsaTE)fL58N0-#Et6UPQkh;OM zeOefUM+(p9e$XvoAxt}E+TSGSB{zC!e!7~p$$TbgUyIbFS9jPy&2Fy@0krYl-2$y3Z1mnSbfNy0>1b)qUqL-B%~d0}EC4<+rZS zw4J{!t?5oWv#Z|Q<4JQ~&)A;0eA|q@r_U4}`&D=N^Zx8DZ%TLiv)$q=D=mvW>dkC_ z>`Bq#^>u4I?>@RyzfCOIq|sr9Tf{WW@?*D>-g4AS^SURk6W(`jvSj|Ff}#hOVXf9Sl(-{*MWXR2ZO`)_|f%io>oaplvz z)f)^jR=R!sUNLvu$zAtPe75Ck-E;EJ#~GsPpceg>iTQEOGEX#~MRXj=E7WD*b?CbF zWd15E>oW{h`!d)M+<(jYwVWwoiO=@)2S3|h`<|_v_WTFO(I=b=@%Ps-u)5VhUMlp` z;^k}Zoz}5wv#*9Kr2XwPb3E{O_rJyu8SNV!#MiyfdGLF}?$1lM-n{j&wj|H`fz})? z?-^@;PpfoR+haM^%k?bVQn%Yr_RDy&o9$WnbsoQ({F0KyWc#C8@xkJC3xZcCpSzU4 zVy?iahgMf}>#i@jy=0Po>^nQz6ML>yUXqgTxgGU+R)(%z-{ZN*_gs5+i)pQ)<|`SV z<#95S+OmH%?W`sTH!bylsWr8H@Y~js4?4Wvbw_0?!Iro4wu>MjV*_k z$1zyEKGr6+CdGZdTE!caN58)RSRxz$^-)9amrDse;=3=V9Y4%+Z?liU{;O?|Wp6BS zTflz!fPSZ;QH}V)t#LIk4j2^d;H}op*tRI9Z*$xqiw4C9sl5BR4wW3KkMF*l($!AcKvIF0{pJDzhqZoMh5F`87JEH-B5}uf-B=d*-C3`aHX;<9XyWd^z2G5o`a2 zcb62+|HN9Yd~Wf*Ti3Im^t1Vioeaa`jki^v1Fc?r=(+gz5~IDb*(*zKl~J7fLe3x~0x!V?A*98FT&1|G)2_yJ(Uz%jn&evN<0Z zJMKREwZF4$-j=S1%eH^%Ra^c#VqyQWoyKN`kNbY!z4hyV-btA!KlHu@dutpPGi5kz zwl#4#tHONlLrQ6l>kbP(Q{~>c-tMf<1wr103_+T%fm42$9QaiyySqzP-f?T3;=C20 z^>S8SGjE)onSO3xWFlA3zfYc5D=(cgnBt`9ufoE^xYRPKs8H|2^ndTymv`0fECDC# z&*#l{^-P++SwhZMyjx?6miLT}DfcEM<@tT+E{k4W{rcOpRpL|U>1proGTpN%FY3{k zIw^yF3(MzzkSu?dIZNx0!}2iqDbF-)wV%JtQg4}402&yc^IKk;;q&g&bBpCp&)fAS zv`qB!zs{ZaZY;aMCTU6K@;tRAkL+JRDu47V*Yq2|PwOJhCtc~M-?r~v=YOWAsl4t9 zYeOQ#ikRgRlCQkgF8=pjlDS=ZqQ?#XnGB#cjai;qtJ))-xLdbP7I?;{dSF}BoVSN; z<^i#3OGa+- z`u?d#KmKU2`tA7OYp?h7;HDjd2hVBEppMJWWc(j|N?yvR~hWd9$q>qI>&@^YLd2v8X%#Ypf>!T^szjK6Ryn+{q zP2PKw<aC#3Yv||IXX4do1^UdE=7}oqBT*^eZs%9NcjCQst#px7TpR z^_uKWz8{tSIlgSk`qNL>l-3{CUT-G6mWe4b%wT`?>pwTTi)L<2Jmdc0-`~#K)?;js z8E#CyS)3bF<707p(;;WaJ3ppQcfadjX4#ym((bNYT&O4KzhMnug8`3Gs$0aHGmNSw zha@`Yu`gucE^%?zVAwq8BfE_6dy5$Ln&;;tN@s6U?_ghK`26_28@hfPyZnt4=eY(Y ze3|aAwbJCa&D|d}HXdYQsNAWeoz|!qvutuj)tci!m{uO+{v0voP~C-$n%LEsqf6FD z9TMdCO1!hQd@k3E?U{S$v$6jx;}gF7XXRDH@|VdokCttcD4754=;O|%-od{$SQr;( z3ts&d=sRVXY}Eau34i&1x1RqrBSOEaaet-I{ts=p#2(MieYei(vaBtm`{O+I-M0dM zu8G;bQtOkm$>l&MU+37xIqx@IdAp%AiZw`+)uBS8fsx@~Vo{B-@)_5-)rVi|?MXj4 zS7O`C;~AoNo)sKu%XU-|y18=NMgiT{X%~c#?>FY?a2%%iDrEO}E{V_%s}@x!xj98C8Nm#$)1vg*JljY^TAA3?L2w$6Ctt0ur@ z(BgTsTg&H5TF&Zyl~4Zv>N-^%)m>)<-Ujp1CX+8OP+8`Pq~NLD}4 z{~KBOLMZCW5p~cK)MaTp-=3^)Ln-~3CUAWxrQ|y(bvar1?Cam|=JuSN9XTN4{*vrhcy>oRc zAfxL$Q#SeAl$%%5q)PpiYSuq2$$0!@o32=3#pS%^ zKkTQ@^bBkJ8}F_yQfd-Aw{rTWp6Qmt=v^S~ExeNqTOyN|iE^K4IaibN&~|H( zg`G*M%=eq$b|3wp@NT+O9}j38JMH;Jz4CB{nIaW&8{U?)@9(kbd$M)m@%xW+f5#kL zuk6k*x@oieqI(M#c`djb5qTiciEpA+j_mQ;gZECf6yBVwv$dtD?#)4gNuCww*{ALg zWjG-4XS%b5)2GG+`$yOQDIVW2(?Q{k$-BvoFZ?&2v%d}6VDayXOvkgidbikv?SWIlSRTzzbR>#lh7s#R{Yu3bo-#pOEp?*!``(i1&a zRoa=RS_<@D{KE2k!|`+@fnHCQtKXa#_gj>83&%e7^jaO(wux5olmqXmVsL5h; zZ?^91Wazm2P>6G3)?TKi9N*d)Kk)xN!(nOd{rI!XynQ!Yp2+-tIz=n}(;P!>k)orw zK5Yv#FQ3gF*K5)#d+3s8*~2dXsg?H)zP0&O6en%BI6sr2zTaQ1^}y4*qfs+g{MVYk z`Idc1>0G`UWv`FUXqA6)<<*SMUnH~CTR#3+-||8=q&4Zv%iW3Hx61cTe}3GgI?eKO z<)t^j|8FvP_33)TtXQygew5Qi)yn75llWV1==#NM`xwtxd5-|p}gAZ?_5je6j9mTN4Ltn;EI3mWB20a8;?wREy(_&?F!dW`dxvd=FR(N zY9+tB_x9&=`(4TtU$pFIkCnaq{M-$;e`Sgj1um6)E@?Qka`w(S8~5G+@aMghZguRt z$&K5ZW9PE^{t$Sk4BB&8edbHcX&t{80@b3yX$O4|OG719uww3xdWmjrXZ7*4wb~L|aV*cXVh2OlECe@rvx^?w@POn?? z{dOzud6WD5C;MtzoST1H=6;3er4_K{k$((BuSlG#1RChn{ zW6RHG1_m%}qA_mr_FvZpi&K+x110cXQ13A8o=do{y}aPCmKh z-Nxz-cVZiV-4c83_xA7nzu)V>m6zQV$?p1bUBbK3CyK9x_seui8&f6+0*Md&mxLWm8d%f9mQEsD?Gj$ox&pe>L-YnZZ^zPs3_CNR6 z+Qx6m7N7a>zWN$#rTFB6`88W^K8iBg{Nml`gMTaqIl8B^nlDm(;w;dztb7j7;*HyP zou9jrX~OBq;^MW>QoDC8Tj``|zJK-lf3=fWt(q8n@>)(n))n8Gf<fHUOzf6n!^2mIvUd+dpM(?GMfjSR;uUqnuzFO-& z{Z-O-%l}KimF%eNj#8T}73ZmYU#xCH@VjMw`n7GhI1_DR)oZsV>zb}I*I20<^!;Vd z>0Ho!RpC6P?(~;IXV=%Q<^0xme(uI)(<>$1g4gCT9k5wCalIi!$MMR$tHr8TwxyQF z#x@3QFn;^bsH}bUiZ#nmn}|;Bo$BTKTYYhx_8VQdR;PWB%y*r-e|7f#tI}QDY&~bB z_U$w+;dQ z--;^K?YM8-e^237)W+*ZA7OQ_iNzeXwuKo|yu4BOpZ`tz59+zq^gA&OH_SYxW z+dCP_oSRdecHqDq%jeY^hl*@|E=GteXPk9TzRxK@ee0L%8 z>EbO`>rb;)d@a_z5F4ye21A4Af-lcwXp}B_>XGg7_^ju+44cF7x z`A`41Zrs0AVeJd)h=l=buGYJkh~%*+m@_k6xX!-+_E5$>dY2$;a~#KZF|_F+2RT zDSFsh&*v<-mWmPfe;`WMOQ_3rAzzn_jpZF^{MmBxPlL{!cXX+5#-+5LKTMv)7-?{!Xy?pPO> zJ@;de0>{dY%G=CiuLY-_&OW(d$1N|>hAca73E$I!91JGDt+q0fU90|wipq4ISiO*K z6YER|4#o$Pytg*k%xAIE|K@4$v7z;X{H3zmilnvCTRavA>V3F9ao#&8S)s;jEZ?>- zD0P|iAdF#O*8%=Q4eisGv*i`1@P2Oy&kH`aSY`DV-*eny+gFF~TV`kdx#rWEV^c1s z?)I`gxBCT;(Ka{RUt5pYUAtSb##!R?^Ha-0gcuGSe^eyi_(f%=-+L`z|L2wSZg?$8 zGB~m0{U&|EL!VDBHu-PXUw8WGzV7V#*BKb918U!{dTjZ251+V}!VV^;DE2T#mnT_n z3y+*zoZ8svEa=3su=PQuqKVMNpgGbOaE9=PaUi-f1nJ3dG7?!#C#a!H|{D!gg&qk3xmqa0_c(Gu*;>h*bX8!6Yd!3_%z_CB`R@FMxEfwB3Kwyd5RMVIJ!^lRnc=&ve82b9t6CaO4-zC8SSn}s zn|wZLJi8_>*Z#GbD+5F2(ZrqF%3o4d!rORk^jq8(F&voUyIxtr&tu`jGe4O{{f$#o zm*(d0w(R?UpYNuh`t+p8`+q4}SR~)@0+<7k>^gPgdx_3?#IdllIR4|&q>qz?WIe;Snv}cj->W}AU2D6l`YI+}oUUxO z2v^kndi=|==~~i#mM)scPY%pUs+ptEv1Ynznz;3D)rAW?oC3FA@Z!EQt4DU>w%}Lk zr<=+TJzT$N)pE&iu4}(Ei~LiQ+97)>`AU4try2KO_B>zZzW7?p`?g?Bnd6yPq{`oy zyqEjma6K%W(P4AEac!{r`x$YDt?%1{`AvVDwjFN!^YlrjmjB^RUhAWx*KRe5a#Efd z=#wTsHQQY*YPXJs#1@mNEmNa%w_Xd$F8aRfX;`Q5<;Pdkmg}tG0v!pf81h2JQ|o@V z#{KB<$d!eEc1bd5h4g%#vhh``SZ=ED-tKjl3$AU{m5e^Cem*C~P>`q0^_`n{*^3o# z+m>CoVr)pvcrCg4UAoz}Wvbb2H+l0cZ+Zq=x$pjc>&mR)i}^cOiAN-4j{L?)bco@Fq-Kshjk#3W0|2)gyURG|> z4X*>j8uzm`^w+Pxvwl*4(7(A}?tv};jnhAz%$VqN}f$L~G&zu%j4oJ&+JhLLft z^lAYmp>Ssn3keGm#TJ2C^535xi2ql!*6HX8{@MN|yY#BJUd=jdthIE~hZz10?erdj z@VsCq2KmRDU5pJs9`C3*Xtz41b;;|USEAxBUMRb^^}@8@znb54zp4~lUFo*;&ayN2 zC-Lf-mbuhvcnU~$Wvsrs@}L-x^YZ8McWzAVabjq&UBP=tl96GXn{QyttC^c7F3foF z&Es`+ulH@m7PDO|FH8E*Uw$uUzG?UR`|i^(?W>!gwqMQmZtcypVVlp$so5Hqa@y3G z-}w@Cxu9T%j#}``mF>mTjGqTrN==&@v(-TDOYHk>%bS~T@Pgs1v?^x1COX)oqWI=cLZt{B2qS3BcSZzokr>Fj3vsR_5ap zIW?h^WtU8zzCEAgcFgbOOw-??kB%@f+_*QR@R`wbzop69R~Ak@W45@LC0TUA*Oby{ z%knoYV3n40({bQXYuIpVW+>;HO_e%D5yf#H9}yBp2YZ8l{tBJEFacV6#ZcRJ2P`rE{b z_MnKfIKNSO^ZZpS1N;BjN$oHWid@UqFe|HfyS>EEuH^V5-h~`zRVOmE9;!V$_v^_I zcMU`wU*Ej;Ai#h1MMcP8_KLDnb>v4YqHsGgl0m@Z=25mSg>$}V)ZJ?F*2v?rShe6o?uP7jtBX(CPmEakxJ~$V_#w9H$;vGPPN&y? zpLD(^<(R9;w}x3aR+YqaGB|wpd~E8!`~5YKpZBJhy)(ISewSCKD#H)^;v)V>s@5f{ z*1QIqmilu}1iP+tx->H@($eDp9Ivt$BCerNt6wh)eCNM#URUkS^iyfN*DkI2|7Y{} zrsj#C_LizdrdA(LwTm*I@5Oyrs!uj?{&f%kB?tfaZ8)FJ;P87-)rbAcQ_rvV5VB?! znAPsWRCH$E``tIw?Xs?gWxc$+Wqtjz0A2Ul&Ch>+IsLhN^71)0{!cS+%*o2iT6A%R zMpw69*1y?3|8hCz;JwL-YCuX!h;Nr+g?R9gPKEwOazGY#?z1wSUS+PpQ?r(U|9jf5A{}~&*@>%uX z?7IRj7mT>?_u75GyzGd5yZDDzyRBFI?fFvX?0o9w-aSoqPORXP`5Ugzz8NxO-;}Oe zpNtjRWtq?>?A-#7*{cNt=LlAwFWxG;z|^*NZQyeE=cg-X_(jjH=~^`7&rvD9Y~J?b zc-i|4KK00MoVzaHE;A%AxUBBN^^bn~3=8X~O$-nEQvWQ+>SE+3XZC20zuj5SS+nP9 z6^S~D2~YjMY??}^jv7P5+Azk3e*sUq-sw6?`((a+b6GOcr=w1`w9JBW!N;q|?)g`} z?)N<|wRBtXwaeGG73Z2>HJvhPmcQz*`KtDNciX-4a{YQf*l*qPPv$v(QzkX3Gx&=| zUTHGxJpTBk)Migv0fq_lJi1pifiA=WUFXe{EV^K6(VX%gH}{>@bN;TWwLCp{);ztg zqyhtt<-Kn1rdel&njO+svOYg3-qO??@nFAfQg+mdBw5d}i@SN-4x7zrd63|;a7B=a zYCcc0*ZK8pbCf(~Bi9(qY-&}WGe=IUOG6~INx?UN^$Ml#(p#t0{=c2`vGtjb7{j0K zPNJ)-Tmwb7-n~$>NLb;fjiX1|-d;D$Noyv(|GXz*)z-kN|z_CBuE}!g9{F-J~v)x^!-L+7`z7si>6WzX%S-ty z?+Zn8Gd5fZ2+wkKuQH$O!L$68E63ACYp2F6hLXUel8TEDt6V4>7Ud6SFLAb(CL*m$yM;2yKPhEm)9@j#AmcTn>_bQ znXIq$ocGmY^ZTytf1#lvV(__JV%63K0SBI3+5BAgvj5%33uerztGLZ?sv|PlVbX@# zZHL?D+o>V5?{SGvf@&)oI6je>!i2? zpJIyulT7G_GiDECUU@$FcPw;;7E?LXFXzu(6|4 zXQ^6lPmSSC6yC=e7Rkt`^C5UDKnIZGc zV*Q*)dnMNx&)fLtj)mR3`XBuJtM;$*x;@2?DdE_*&WHQ|e+|yv`fKU*^H1a>CM=Ig z^jT5;wC8I`?W5xl3s$6`t87<$ESbiy-1GBr{f=k1>1+4~DxF1(ViH~H}R2SfDY%uQQ5cdRjRn$6ZH>zEVvX`e`lj(Rtq?>>W25b+`hfnc->!ShK4)dlV`}tag-el*?;!M_0PMu ztgnsx`+a}a(f8~jTE`N$EWPyh?K_W_>L2CxKlrc5h}Yhmeemeg#fLVqK3L6hXLeO~ zq0FDcXEL+5-+u7=qK6&Snq3V_D*_D9s`psBAM9OdrPGjfyH*Y8r-mfYNO=_I3{OCVFj7v9V7 znGc+JzgTot)uc5^{M$a%JZpEzP+1jtJ$Opr+DyS?AC#FCTQ0Pjm0Af)acOo>^|`gg z;jd%u2fu(hGYpUPFVgrO{Vn9nKG)O1e#e48=R|}xDeTx4JJDmw&#%vpif(=2+qK}Q zOY!})cHdRE8>n>%C;iB~ae4atNB4uu1QbI$ioSXXu)K(0lVgzPWWJ`RFc zemva5a#cD|aHZ`m)>mMa}UnuAVtr zc|~;(w(OlK!}@0D%bm~miT$bF@cFLaWx?QYQR$QU6C967Yjn7+o3pjzu)ZI3XyBZA zPy3wv7N2+R+c+)vm#h1~%`wTkw?D|sF49PiU1(FkQEKa|XAM!y^IyKqn_JwQ71$Tu zto;?X7NEy!t45~g+CBfbN35#~j+wsqTCmz-McvOKGxvNe{ud?Sbb8%K)7rxu`_}QV zO)(VQC;jx_v6=mwCfd6(GR*5(9RGRl`|nrxtWfLbyn6YJ!v^nnJ2NbQ;OHp1Tr!XhyGO`=%% z6(uu6Swq3-&V8?I-)ZMD1gs4C>i&6d-jmf#3?iYH+nhN>SJ~JK*-nqrt_w=fFSkAy z`Dw}qj)Mm~e#M7=ioE*b{*H>6OE!~b&Mdig+~wZ8I2S7|75B3rw#lBeWMHr>Jp4Ph zz*tw~+)}w8o~&E^Qzz64w?**u&6>WJSB71F=YxvmqK(Wg0gcecnS8y>iTnKfpQSG1 z<#!idpvqY9*j5`n%q|eYY$8T!`KJZ(p`u+Wj&{G<1c;RpZpY@?SCXQLQ^J{H&8_I5649 zmwBGJlk&vu|MO)T)+~QzegE@=6-+H*^IxiNOU+Kd|Fz+%>EhSP^Plc8{8|{e>9Oil zv!xruUhhd@W!N+$A^Qr$0eb+$OXvN{qqBJ>s&q8G}q{gMd@UV$ORr zD|PKB7Nl9v^-SgNJri;FOrc)!RKv4%z7|5~z8a{8Tk;%!Qg!O*KH)S^Q=e$tI0)aJ(&Whh)wC^@>wfbcacR|v4Sb!n8V96 zb=&Tm)ZAd5#%7VjqB_;5Muwf?hFhxGRtsyd2b>39t3Nngsk3NHar!5}1N^2r_ttPM z{3+F2^nd%Jg?krY{1;aAK&rfd{RNW_Vdm`H1})P#+(j3-ZrY#veBWb>zU-gpr~QbS zqtJ0-y5j4VPh49sUApvB+*RnZvzle!=a}yW-*-MKJ$0qEyVZ+7!C;ERJuc^}g zVixtwQE2(J=4DUhQ=*r7MP#g45z_OwwEkjMuy#u$>#1B8h7TJp4y&A(cXFP%N<6CW zkKNDL4<8<8>{7b)Nt@B3!e*{KLsD|#4W<37-#=faaqKu}(}ERmp34=BatE;V6^or- zUDbRst>UIwUqy#bJm1MOK9)JY>Q*m{CO?yOt6yRCDb(cpA$FthqVYOn`kJ17^Czfq z@Vaif`pRauLd&#x!HBxNl2|^8{ujU3vAh4T(fxYn$B!QVMI!I&co<&9&YYWFljCOP zd-)RoB#VjL7iYgxZoTJsP*`BTPx`au8Xd9anam6x{tUlQ3pjD)inSJ48AoSmn3ON$ zjk0!HA#nDla$vpB``7$tGQ~Aj%Ef=KJ*xQKoSS}kVFLeV^_$F#LxdO<{wgrCGAR5} z5Mr62vT;F4NP>q@R&T*w=1DB;)4E#<*U0^6&`CZ8jCcEuX^xX zeqqJKgKToWhh4>E-Z!f&iA>y}`o8+bL+2A07k3Cmow>TyBsc%N6#r(?-!pb@UN>jy zTP7#Tf7heT8AP>?SGF%cyU>2c_n5C!3{$VKi~Ah&HRFm@mNqNH#^W1P_T@~Tk-RZt zS_ng-(-xDc5Ur`dC*7_}ySC=I3zNzDljSdSOR9ALB+t9yHQ}_x1w`x9-)HGw-c$EQ8(W>O`Fn5{^Q%Ai|L*&z@H^?;>o1>mrrmVjK7X^z zzFqo$9-kao?2euGKPrFxsh|*p!~11_x6k>*y#D_-W3ld+{Nc~;YeL4KeBlETGap6> zI;}oX6eIsL`AXW`H8pWlUp+kK{O-)7Cr*HYgR=m>mIxd&<@MlUw z!vD1s++zI$t+I9>yesXI`t1wrOk1_;-PZnc|JMc_-B;Ch$@2c!ANlIeb1lxvQ;j3MKj&T)lN7Np|z`l={<454avN6P5|xP{UO)@1RiY zey-KuRwf9kcq%P-^EIlLs1kp>@69v$4+|#-JZGOdWzf43#IpEPm^Mz4180 zM((=JYQ}~WcR3h3CTZ{obJPp7F>w6%Jm>j-+11}y-)ZN~U@3HZv-@7U&78;Tw}RIE z?!K0>cfXtKgFP4S)Lu-te?4vgv!BO*iWxO1z4&$F*3Y>0yUi84CMkG)+x+gqd!=*b zvx{>TdpN&sk2!eX{hsxFWB-3iJFE9R&vK9ub_wLVBNb>H>m?>EsiT&+ zYPnK*akc#lR)#{SNAEsV@~WD4cmQbK$mN+v#ie-S5%a zdu-WttJ(FLljbp;=U&-u8^CgQze)MN+vV8BoWM5<9kf#{sS8}3r%A`-f<}?{x_@%x1?5&xnWPaFKNPV+7 z7y0SQ%fBigmQUFIJm~ezYwz~0{QYhFa{aomF~_FiMRcZt={UrrZaC8tZ|-{@MmGY$s55(66Gbu2Lo9%J}Sk#o1D*Z`)_v2##FiG zboKjv$L~J(SwG{>^t)f(C!d~r(ImI-YL0boaeSHi{&|0mR1O<$qX%)5A9fUiKbu&POy~Tu|qhYn>WBaqblBs%LLr z->gaYx;F9aUCH#!EA{_wRv$d*@$;V5q&1uNJ~WbFtJry^=-I9-uHrwVX1(P2{j&G_ zo$0lzs=Ma?PwKeS%h$fkBssPxY^T-I$+V8SB~ESbgBP zz4y95&;Oq}Y1=XV&4sCNOb#r0vZsKFA<6LIhfTdY7cXvExZPZU>)Vp`s~iG%X>DU= zSRreb*3ZdMrT_Dcdz#M4V{!q)(S;5sPT7YePEVVr<*WZRTEp;{ZunQHZW+0=)rSw> zeSGTswbD87x6U(L{;48=i?=Y-R_E}2+ZPt?KUKLJXdk7?%dV7I;&&K z8>cp?2kg5Z5EmD|Gk&U}NT-fk)4_Eo?q;0ilihmv!j~xZ1xpKKzfGN{b=UZL!p>@D z-e+c~3;+I5{{KU{-hX}U*7SoPzkd?B^sVgui|aF$orESI{*<29D`e)BV&7qi;^mSJn&uwBMO=-!5d zfyM&f9A~2sANuHK5ymg9RP(HzUFMBO<6Kn(&VqxMb93D}MKmXwx0sovryIKps&Mx9 zR^5ND{OO2g?pCjN_tRFJe%vu-*4g_{H!Wi-es=2e=lHTsGZIc^R2bFT+cNJ(nwqrJ zowNBscKF*_f3?#1b8Scqy{$na3xf=cynnFQJlL-M_PI`qp`)1aw8s`+nZ~6&x-KoX-*fGHp2d>b)yEV9Le~DZ7S8qP z{&m1mX4}fET9p%wqOL#t^WwxuHjaCpTjrGP`(9T(_v4wv?el{_y_zxE;jM|u|CskP zB(JJjNL<{g`}i@lh%3W^j49QAmle7!?}b}(P28TuAM(l2?hiY^2qU<`xp51G=ZvT6|_uFPMh7BfVJF26n z|7=*p{$p!j*oi8O>5d!=owk3fHIn?RYdby4*FEBQXm4-`ihqZeMv#?C-SyU)mm9=1#USoM8HY4r|&Lt*zX1 z-&fwcRqef9lhL7yX_Cs)RUY?S|Fo-qI-YTrTlewflXXi{9^U77+5a?cyVjS~Ew5Ua zeRQ86e0ybxVrOYVWXk4<*L9t`*%9VW-b&|RMQr^)|BA|_roZRpdi%^~NFS=_c+Oc8 zd?4)S-wl17OzXV*1WqNHoMNrBzI1u7;QG%CHP@Yvd#yS7;e=_GtIpJ_CRoSvGd#>+ z^znFM<;G6e)A1hXmtO0df92-wyWP^8lh&k4|681_dG>ZlQ@PR;u|=z|N2S{+b2w$a z>3Hiq{p*yQpQ4N$)@=)7T`)`byuy5$)+avf8MC;gER94$|F71v5ZTDg;K0!Audqd- z0#w_zDlFdLdM`J_;#y$TDj)e5ofoz+jm-{wq9J-G9|*v@O5=he#_H5Z>Qn_4ud{9SI*;_|6X4D#KlZFy|Y3rBZ` z%xUI11?sc(KmN3WiBsI+MoIxIOUQ{Z%a|0UiF=Qg3a>~ov04?F9rUrFXlDAhl83t! zd!rWLTz~P+^^Db9r@47&r2H)vOa2kiB5-Ogbmsrcoyfq%M<~k=+*WtnPh)7fwQb4O z^iSfOF3hNtoFcNWXETFjvip-GqO#VLwCCC`=(C@8XrhLX(~Hv{uce<&)L(4C`EYk& z(+P8VCdDbN^G++Y1T6gdd&T#M_I6J#)^9U9y=f|kV#_t@>#plHnhex-=vB?CU&qey z&e~3Hy4LE@0G5LX4H!7=Q}`au^q==<#oLhcs;l3dD}Qp{6~f8z?|y4jxl(Ta(^&P? zZ+bOvL|p|~7Jgpje~GG?YfHXY{MytKmV9c)ynFL3odwSr z-_ALF@ZpEM8}2{9ZnHYm@}`i~p+;8F;7!%TeUG}2K2lY+nzSY>^Ib<>b-Z1&PoGl% zQR7d-kxA2@?h%@^dcu@n$yJZNr}7?`d330K%4N{aQ=gv@hPA z*`c*-<2<9Vy%!d(%~@1_(Ukp))i%}S)jyxioV;?{RR1T84flMb{Uu-bq`!F{^Y*#8 zz{iO)xNGK-}!0X)Xz@E=hiUHzgOV${%F~> z>o?EuniX%ZHT{}+BNz9&h7CRjF%PAp{uWGponXrHU9^1fPCMm^yU&}NnzjBHko$Z4 zOA`BKZuv8(*jxpqxOUo=74lm&DXdXn+jf}Evi`bz>|Al{%6Z%8ZJE_K<5Kp*ZNX>N zXYc$y=k+G<=(VgTf;>K-OskU4wby1p*!nB^>oeuF!w*9vKXM;#S85TsHRaB9=K7zX zw{nRp+vnI_e7Wn*)v(p3=T}VeI#g^s!LZZI?)Bqj8&^XHfqI$g?R+UyS5GLZO#1co z`D^}7`m4luU41r1%38^O3baRlWdncP!pooa^WJ#4Dek<)h;tP{_YLb70Z{T5aN$b{_fg=X1ul)oJ(F2N*80SS)bXHGydnMS9w)&?hG;#%AED-oAu`ukNy6+!F>Pyr|)TT zxvVc^u|6UAU<9l5iL`k)H>e46Kk?$;bGiM7mxcA*g$pM<-LdrZ-ewV#A zf9tMYo8zTdtX$dYws?_7n(mR1Y_2<;C(ie|x&LI}^YDInsz+mv@qc{7JJ@48FiuDMUuZa6`fceRA^_h~suADvaQPvlbt(@eLu3p1q{uKd38@kdES zvit029krRUK2=FpUY-Yq8`N)dC(ch_xi;j%c1DH|cfY*ke=WZ8!J$bB=`v0n3(qe3 z4xWhL^!*K^>Bi8P`-B)8o=rZMJ+JKk+KHd`>c72{xnX|k)Jt9rAL^eykvrmD_QI=7 zDj}#S?nJrVjMWoLUK;-Wq$51)`X2raN+gh5#~tp7{Lcqf6<|8~0W`m;b?< z=pgaAdfm1lk#+1_IzbcV%#o`LCa&Hg)wC^&`}~RpQQDr9_WWXC*s||xmc^D69t<+a zE7w);_&vwQPGRdNzNJeTmf0z8(%pX8{uyVJLifoxts;&8Hr%`Z{__46{CD^&@+-uz z?@>MYVIha&mPzobcJ5nRHRiwW_|F#lFB5km!?24E5qw8#_$GjPJM%&!x%BAZ+R-CopCfPk_`Rm#KQd4hFnJfRL zbkAjOhZXZv*DOEF@ZkTMn5^&Iy#o6sj(D&ba@MG=qU* zTNEq9FXyS+Xh0upFZB_+i0qrvawHP^^3b~hZCiJoC*vU1%zmJO)_sYT>AWanAyZ7eLB}9`EDK( z^z-BAbp>^lCoJ0@8Zz;yRc`9!|796{W_P$kSG*E+4ZTw4{JHbxQoW+9S8Encw!JYa zuE{`cLdw+T`ZI2}ZTYrbPD>x|(+-zcyA(!qU==>_G=!lVPY-!Ivw{#+nn zir(L8zkE(adCdEAAt3xmUVqK}d%o&IhgW`6XqlE$JLj}Q%LTRvu;GH0Q!Z*O4+yb5 zw>wz#j_o|1YX@VVJAPj8^zN|dx0!DYD}Oa@4t}CCIIH90X(4n9Ax+{eDOzd5Ps*TY=s|4^4qrUGLP?m7>ZOMj}0=Q(A} zTDNA+m#@El+$3$k|m3+Qas^aBS<6q8G`Tsu@-!CusW0Cj#vfQ*k7afv{EDSBr z6rL>LyEprw)nm!i=X)PN{@4Eh!|Ly=S8efK+5PwBF?n7Up~Ln6UoXFv_0?N{{z>Bv z4idtz;w+PGL+Ae}w2*n_c~;>}@bsrU>OPbU{$rf4b>y#SgKfacH}eF~X)ONx>F<#z z9~?Gle|_`fx?JFtlB(#>o{KFE4eZ`smk*hJ=G&Jdxqpv8e{`SUZ~yDhLwmdU2aIkU zx(EK)n=5>;-}2`TbecT9xaERXd$K#Yit^l{_uI>R>bui33r%j{dnfzXYV&^8|CJY< zR!bnwo_hwRb!nX2`}4<-=Q&%KJ&bUF_3G1`bxT;^djFGkJe|OOAY5>V`PZTXnLma` z%7<^~e)yU(jdy+3gQwFUOpyEcQDC3=!)`_klk2aF`i~_VF;3=ua4GKZX*~_y*3<9q z%x3K2{NN=!XVam6PL9^}kSSYzKqWjwLCC>R5%v=~um56tRkhJd{Kw{NySM2doctty z*0QtfXXP%>eRn$V=dJoMp2IWZO{3#BM@Z?Odh7MIuJp40tWP5GN5e9|W&5}Zm(TzF zrD}$)&p)RdQq%O7-h6KCth#=iX-%No!Eeh>|MFh^wzsNFX#s~;h|g!v2lSwi>8My4LM;-=3X1Tq{0VWyP8hM?r(? zjKhg<=agoCTYcsHw3Dj~Pye#xJX5^#&CMn9M=EUARdq2kOj5b>JM_yo$;HA`ZhK@| ztKJt2XLZW>_w4gdLv_nrm28&3PQ2MEa%e^ZVm7+!5X*V)Wl_?uFP|7_Ez(F8nH2Z{ zc{X~_gg|fP*=VEruAo*S|GWpvEf*%SzIQpH>*AlkdVPI>$L!U<0t@OlZhAPQ_T|Ov zMWKqy-JE|9dU-N^?3^)?$$yEZ`Em`f`W-*tHIU95F%QzsM67!or&QN=OHnns_F&zr%TRJ zxLYpcArunkBzQoMjZeQQGqy#*Y4+J^Tk{y4w4LRiZ&YKp3rpoZ^I&emFXu#`1>1t} z)b{BueL8>kw##O>GiU$Fu@GWw;0kp;Hn%5dZcf!@VQ_16>)E<< z{etz&Orxfo{NWYvK6=*ud9`8OxqKU&vz7mpL8rL_euZ7%6HyYS=Lv7tv>d=?$(t*-iu#p9;-ci z{qpQ>Priw1+)NCx4b8G!wSDfYc=3FR7PH1H&yN{RTUj+rlB4YGKm9zEDPiRoGkVfz z*q%Au&OAv)@{8^^^VoI$pLCBue)TPGch>SLUXypOed^M_{r=1B~;o7ZMEbz4jGPvr*Mq%2lD% zS9i92-~I5~Ynk7Mp3=@fSW>WVLO7TX2q%;X|kN zz4uMC_q|Nl|9Ze*YeB76^PAZQN0JJz?76Z^fA@naqI{AMG}+eeNL+Q;Y;qJcdzQoc z=67;3K@Db{zazK5PLj`2tlG79rRd)azXbP5*S=fs+gZ=|_-bP*U$W=|-dxw`Wlvt- ziTs+t*?60ATie?|D=zJA>UP zg{sVqvC+@|cj>KH1(TD_{XNmDOIa8+zcYy))Ze9Zytj1yoJ9U@CtgdPiJboP>Z}MI zu|2|!4fnJeKL?h5o6y?x?fF9cC81iK4-%HV6qn@*7GL18ih)6a!PCVtu#C;4m~4xtLoI7-!&?=JEpF$Z@J+$BP)`@KsJ$id$Xmt z0U_e^c8utL*SIo8E9onQe9JIGUis z;;g8VykN?_k8kp%?A|n$TRq6T#k1~sAwxqhH_yYJ#p)AOCa9dae7-`?&FRA`Nrneg zMD?EY`u}hh=!W;)2 zAMVb1$b0SBs{N8vZgVg^NG@#ioM+$CrWC5b<_n^WA<^+mka?8rKGvm)?HWe^d5(@w%Ih0#R-&&+{go{u}9k z?(zSsdpmv`GAt-h?OXpS+4xfCtZ8)y&>mnOXGW`H^ZY=mBfELH*fM}y0@p<_PAGJE~`$-zl%JnkD&f{<<}aGmB?F7xccrxYCU6Y}-bz z3u+tMimioK%Wh#fn^=0EXI6U1sa&t~UoF$_FMFB}nW1I7_VZV>Df^Y5`)}0zb^La; zX1{C78M$45=cs#lewTRGmuS6ju`$2*urb_dew7_A z+jzh4%sDrKmX>fP!6@C8=Xoo81m(Tw@f-oo=?0#5UFp-eev-Ub@ao1(yS*-7uAHa7 zO{j?Df{5O6O)kj9tT4~A9=+S4r#{!s`_7$QSD2I_S2Ss8Nj&#kWXz9YV6PTbZ5U+s3tHYi&j z+7b7v@wm;LTyMJ?H|E<@3hr)R;-$a);rV*TK%aYY_Kee?R~f%ad=O(@Bih*clqaR* zLe=8mk=zUc)}>OVdu>GTT^3LIHsj6PJcbYVxiYVO6PEPK zpw;u;a{u2xslD!glGWEqIj~ZD+cH-P?>5P4=4Wwb*muc>Lv;54o>pdxkj+0up1*xuA zI{3M1ef6v9msNy`|Mru+Hafl=7}>j)X(|8 zdMU>)yG>>LuD^cA+p$Q6W76L>)<1T4e7-y9@^{2;ft|~L6o0Qcf3?9ttz(hM4%0OPm>f2`v_xvwAQMN1CFP-3i zrIz60+Bc#{Q=UDWfBr|zBzxO8>30`#Fc?TZ72D1&?Xa$*YP0jzlOON1C{~^_mwM{4 zNh^Hg!i64MOmRo|RsCNp;Nv>sbW~H#wdESCCiyG08a6H}>HB=SHsztmlw0efkIA~f zmii~*mJ#`2zmOA$Zp;6&jyql%7&_;gGV{-dm{6U}&q^;|Z7Yxe za#qq%dfGPqjG3|tiQJ6rUmc!xm~5Eab6Mh;OMV)LO+5}+$~=D)hE0B{*~HF#`r`ZgBQ_J=c8B> z9hN3Vt-1S24Kk5>?Pnu$8_2ep_rg2xeGez>KAyUD`>spT(o!!^hF*NLwn#PY?(Q#T z&oVdb{P8vUXEAT<{d*}k&LYA5@_c{(uD|D@GE0hiy0-1(6Xr6n1H^qqpkrKAQe_*QPH0_N9UUf2O}@WmkS${n}&G zsc&tkYqqqhO!}PdUG^gA^v@I55BRv>@Xz1#eBT>w&5LjUh&w;YE3vq;G;np=be;U@ zecSblbxSeo-T^f|EqBIxkRYJ?!S?N zA`kzck=$eK^iTfoxw%&F?B0Lht8Ra^7PLk7L{e<)GS9_frL`GnH;Z#DR6X@|=R@?l z)ueNaG`zx(Zew8B>U{i-=Q=mFezkKlcVk%YN%Osv3*WbW-Q$||U$vyijJc7fV9 zE#q}h85&kjGu6*BJNjpJ#HnXFy}Lf{*!ORS^B>2Sox766_UdQM6lMHi^W|A=`5y38 zr~;O$(9ipB)UOopn~}amCLvLqF?`vr4U1X2L{8qmD^T;M>C@bRASQl`A7||MhE|!i zn61;BZYruD9KCkZb&fRfMChw`FMjGvwyjAb_+B`1a_dH13RZvTGa@=m6aMzvNX3d>Z`u@`GnXAug zempM35OCY*y4llrAC=?XqR-Fp6w>I*sJnZkT6KcD?c)=l`CAU;yGPZhPTU;Xm;V3L ztmkrPpLe{yvr_q_)}%FD_c~Kd)ciMgS4ijNL_a&%bfInIw$*{ltQy4bGRPd-)D!mc zY=XraQ<-yfew@CxLb&tc&*$t6xur#uZEiC$xSpNyt8(r7y9FN7QZFL|Vl}^Q7W;kk zIfvh*-;^r7W)`wSBJqs9wXEWnJ)i!c4||jBrX{>r|s7= zm5^Z&>P$H<=^K2n?)jTPklkr7XPW*F{j`W}oB6Bat0xS${4bk!$xPI8UR?P4t>-G- z1X#S{_>6T!=FahrUda@2HhtUWoGWFgYC`Up7aRD?Auk3uuFhcC@ORU`??nf`r7eHH z>Tu;n=bXl8!j?&mN-YAXl5@{z2|BGPNU^-G(G()yqH)fm_+v~iYlg4?%vw2<-TPJR zMI~o1uL^l~^U#+w@9te&ld4x0f59s-w80`0=_had6tY^fB;bS`sS9P^yL_KvMxa$%fO z?o_`?Gd8BE%Rf%uXyGf(;84X>toQ0Qv>64> zt=itZC0@PHCe7TZ* z=f(T389%c*_|YUQ^ep36zx$Ui-?g$WTMMdfU)Eh)RBw3U;yvp>_BY#igSK1VX0x5> z$g!}L?|1ZtSu^j?lHyqCDxkhZD|hnermJtWcat?_2Evr3t{ItihSN{u`<|+O@F@SgN=WV>WL(! z@G7^BUaAx4`BrVRsot_fd7D*!b1!4KgTw6emzv%5HnOuX4qGSxBMLNGp;2`7@@dgk zd4gJXLHmoJdy6ccQ~a^%fq3k+$H#VspWDD5{e%4^tK-e)tjGVOZ+?)MJ-grJdHfD` z#g+>)A6y`##|u>-?|b~XaOI{bR#yQT9_EG*hwnVDcrsJ^+vYsWe;!%3QsA1Ot?kQw zzKPMDS0*qq7+l@7Z+5d&AER>-yWfk`9`m}U?I?fw_ROtkl3fQrzJB(u+wQof`F{ri z7R?IvN54)SHz;}f`Bh)}uLL0$#}|8EWZSG`Z-{v*sWmU{)G4pq_sWW8-tU*)Gni0D>O85V>F~MkiWZlJw?{d$EI|*8xi_}^Fiq~!S!_??3&Yow&U-#YbiKy?)md~+U z{i)kqNe))Xip10lS ziIN|cZ!%{kt-e&NdLS%2P5hj}majdL-;JZ6?qAu|92=<}b?RQL^1Lr)X}QI1&nCM) zHA{WYUMu_l3zNXBbjjD5#taqtTei=6v7qcl0(YX_AuD~A!q=DXMJMc*?zA%Qnrsd4!N?~QrqA70Nrd~K?0{Pp-_hj%Yn^dU9Y@^n#- zDA$41R{?CUqW^9$5^a>XkiI=fUiRia2A~mgz{PM`2W8P}M87x`t=l-m^_jRJF z?f;A^zxRvs)=T=fJ>ceb^+~h-e_;OBLl**;ylRCUY_aF>L9683{q}qX-+x+qd!+rV zbKolz2OWHoV##f#lFeyO`Y#u>D= z_kz}e`7*D0_bJ`bZ8KZD_1%&~q5>Dxrg`Y7R5m~`rtm-Vf?k6KjxJm!k;{ndQSQd>xU$$__mN!pHiibYco+-2RRE3cf;vyS7ONO?tFrG2Zr*W_H{<5R)eQnpD-xb|E@x*rtKNIv=Iy>{<)_v0 zw{~7muz#(!bSh|8=%g+3k};)vT~*ax|DXSV(bW7fJ3RX7iHeKUdw#I*d7V6c`E_9_uE_Hdj1B@Uw=-uyeLn3$!UWA^D|-*U9T}T%wd{EC z|BSp8S7cq@%bi!484l_^o3nT3 z*%Lt<^?y&wN7{;dLM+xGoAZpEmC2>aTj%EVT4h^uELGkn#NzlP@26D1`6UxxhJ*k4 zCb68nwt-=R{fg~-6PX#_$%*&6RqK5X5MgC7@#QW|EX(}EY$w!tqdv7=Nuk^0b71lD zpL{!67z(yno=BQ>^XQSsAFtkaZkZ-N?`V#n#Vi(GzPd1Qq%1soD3Fzd@xUJIq_8cU z)l5&TWQ*SL-(t1Fn@_Rj!ZLLZ=IpyHTLjPknYwhX-?|-&o&J~2|7WE0tGOTZ@K<4&a9rTR?iYWqe(JAe(9qSLDu3yA#!Gfj z5!auJpt(rDZgoe#LyZ9s4{n~}>)E*8B5DB(pBrTA)4O3Ymzl%?Y1Y_-m@6byZYvOMSex>UA^Cy)gSyel$2}6di~D-dHHj|Z4HJ8 z`yW58VB2}&b_PR-ZJ*&$9)=J7l}Xx;lb#s8<92$@1c|+j)(7W#S_GUJ8WwX+W7+Rz zKCko>cjjD^WaGor85CPCSS?=>^;%3}OHhkp&pMJo}z);=r_T9U(_@d~( z=mi`WeaRASi4tGyN}sdOJ;&|$)J(N}{^D&xpfga`1ZD>O*aHj_i`w07)Ey7i^& zt9XKV>$|F=GujjNR@K6Q%&=br)x4&7T?bqzg;{oQddxwTT751jwZ zTGrhu9Q2?(F?em+)2J!uey)3dX7*j?gL>QC_SQvBU8FIKtL`TY!z97Cq5ji*>)tXl z{C^wpe0QyKea|6b&z-(2E5n|Cw+w&yKSR)6`F~$dME2eEj*VObr_%nO`QVXop~-Y> z-91jw-pGZA^Fv{dTiB%5#lSFm!kmO(4ef{76g(GbSj-j6aa+g`%389!VOis%2dmQE zcKL*U{J*(;yJ2qZ&wW4k?`vAUcm1KM;KcD;PhpX8DkkM$1U z+xqUyghhK!uj^e|!n*M5;W*Zx-OmNXG^@2HIKNK|`&J{=0S42W+zqEJj>|bJ?8dO+ z%Ho}Z!3UDJ{f9tp`~uVrVj#bqDo zHk*^~re8bloUz2QaZ@<2D%aqw!^4UxZxvQ^+${D}g8YzA2aen9wTLyq9m!&A#wkAGU}d&YP2S zbpD+m*V?UwzeyEtVr8(Cn&G?O^FVuZ#)d^(L=HZ9^fNy^F+spx=SQLCvPORP!Xr&q z%nU7uf27)O)A$&n%NK3%^7!Q6meS^e7f+oC|Gw5g^6ue0-<8WguRZr8`rPSr-F@A< z`rB@tzx7o0klMn|dGL(*si*jrUtVepB4`zV&u|cD&cWwfft+njREZ z+r9X$Ao6Uf<1EuJh2jkt&MKad@IQRHZQtp4C+^+|&H8`;&$H$#%bCB0->*1c`1#p{ z2o)3Ae0G6dqDE4)qT)8SIXOqIUAFS)nmIwg7o?rIJGCT^p}M^Ob7$4#xVg{Tm-c;L zcVzpydD0SJEvnv}U90=8GH~gw3x~D_=}wsv^xwfUXvWI#R6jO1cYVZUx7iWW46l6ETZLXeJG=1zuk&^5ucuq5`Xi!YO^8`c z@-kk9e&Gopiw!?L@7=7J5@1%t)6vmUB>UgLv!g>}r69lG+#{RMe)xIeZufQT4bHu< z85wpMHLMkqyTPWg&1IV_Zy-y9QlaPUfR)MVm%14kvP>C7I5(DeH^!;&`}F8(*q?38 z@;g67-HsCJ=~(e#hka>x(~9*MnGN0;R=C-G+S6I$<1_X531T`rj1fx2is7{T-Dr zu|-+Q28Ro_b>1VR-au_bu9J+Mdc6qqt`JG~(LR+GIEoA0iuQa^c7PNM2!NPS>t1qr# ze6d>l5x4MTAJO8NA7v5^TU>X3Si7`+x?1Y=y^%Vdp{18H9{;(|dhFkuY|BhBSC2^- ze)Oy~Us&&!WaqioQ#e@5btYefhIq<($%38w+}2xDTK*U&oD~)n6ch~fd!WekbV8Qw zysQJ2>^6%lwy>?=`mjM#ikHDAsPo=$VR??1eoDuE+!-E(aU495VHO3}3+@Z=wzRO4?Om^`srukw z=t|865_S9USDt)1|4Z_(e@+Yy75k6RsOq+o>U9%RTjn`y|Nl1m2Ct=2pC<+F(`@^y zIeG8xRI7v+yPwSaar$Vhr^?cnOqXSg8xs^HcvfF^W4M^xxtZn61ulaXw`>#LuSr>J?&1@>_W>65|Ieq;%V};wE zQ2YE}&+Xf$$;Hi@(qu5(sCG+Zfsrz8z1Ic*G2W&^E{5V zUZq{A-xcjB<6ph8zFVk%_L1(jJFFUBKAj`6?@qse%#X(!di)RKMCxT)Rn~5DaB=yW zd{EA{hK1>`+}_`lEz7^JDqC?y>+6H72VIMM@AO7UujxH+x^3SLtB12KQtY-E_$o*Q zn9obUcL`9269Cgf8{_8=U`T zYFNnDvS*rY`Hko8YgYN6Ynz}M`PEQCN$Hg3>L2R8E=unnmNZ|~oz>8>Lg1r7ThWRA z))!y9baGr*sJqO@uuf4X*I~P?zfIrs*&p5>QL-#4b6k0ZmA&q6)7x38IlrcV{gESc z%VdORnO26EFCpwN9z z>o$+n6z?r%aQJKY_rTMK0UBE}LROk>arr0RSYQzqxz^S2&f&)lPT!qAKk||KEOYcl z#omu^teMy9TQW5YG#q#v@x+@yUsDrYf=c!7`ZV#=x9h(QS_3q${5FfDp|V%2XO3u&iiN6w$x_^eZ-StN93Uqgnj%^z

v0#i={bI#%{Lhrm`RVaa;myioGCTLXPu!6`afV%D zTmGI~ZQ-|*&OhZ8_i~w{W41|8P;jYQ*Xo&DXTa71B%QxGZ=3mTnW}aL4yoQ_g?R_h zTQE2*zBq$__FDgFQ)`oD%*#H-K0RJny5?y~_XbafgqlMVoo-*Mzx19r(Nq0ze!pV# zU!Ur~lfOo-y;gML(br{r8@yUw76+QoH@R+?w)#)_+UgzL4Vm-n{%FVlef;Z4%EgQ? zjq;L~%l6%?UsgPSCVz#iX+dqkW676H4}M>Z|N42^%>Qz}Ha{;^ z=N+g?@N4^Z_vsiOAQ>_g1$ve(^=ja!{B_1#MN zv5(Yen`>;%S*thw?cH~7`!568(A@Bu{MR~~8j^Gj_k@^ko01`%z4-rMW8dSqm&#vR zCuyG*`}ka_+4OV5&k1)9JIHwl*V*Zx@6|F^eIUpcxa`C2>HZ>ItkILF zWwzNfxona8!+TOLr#p0hyZN=7r%rFpT_5pu`s4Y(L0S3#pXU=a^pa=Po=U5{ePrgo zI|nv$g|+Oz#hRK}oPN7jPG*Zj@TRwu9b8CX8dszl-S^Z!qL$P+9r< zt={+Ld5?wN{2%=}{{83Qf7`-uuknwzzW<7)VdYWt?HTi2Tz>W+*9SEfU0k-*ya{!f z685W*Y14<2GiQ9v+@^kyc<$oja=PgM`pd?TCdzv)HTrjF$90Y6t8Ro|{9jl9ci*pT z;Ze_11$IhrG>h08wf6Cx#XnPuf30P0KKSFa2`H4fAfY5Ec+qHMIOD}vDbGJJ+>{Kh zd;DgJi;GLPR*AOBJ6ZOCU5iC7GbrRvV(6(i=2NJ!mf&mGu8Uzj@O!7YgNl@=kAkKu z!#sVPd4~OeW2;x$barrwSc`#zUr_L3kw~f)!=gLt@qT{xs}3GJeQpJ)12Rp`O7?Bd z>dWuHdwZ>XJJpQgm2B4Q!0gK()!rVCI&RtibHmMFTS7NGCtD?G-4CsM6MlS7?YTp8rq}9Zxc=>vgX(-U zKGfCcc&=x@mh8~Szt;TO!Mz&aUQFIUJL^R6W!;LUy!U^8j1m6#HKNAZ4457UTI#A5;+=rDJ=Q%$8$@c@BFoCNBiE7 z2_i>BrF{Pu72kLeb}sNusKb_Jn?5f&bH-;Hn;RqnN*-}OTJvdw*hP(XJPZfEGW;{? zxpe7f`Ei>SR~EXoXe@H$-*3MyW?{oNp7gf?s}(&f&hPa2rTJi|n}^UguZoqT(W)7z z(>AZV_OO?4#Z?W#k3rgPcPn=AEV8inIPjI>RgZwHhtRz3XWOQm@ccadb1gp?YhG*G zZG<@qg-=5D^RwmqBU@`1M> z=1A=Okdz{^zC1yyVy&$Hje5+0L1*WvXUdp7juR0T-7%*i>gNhkhI7_Q`uE=)3GTh2buj1P68Uc^e%AVy^ByOuvqMfp4 zbEoRoS#!Ux)xRa$rR8%pFJiiW{_*+0_k9ijyGK)~^OW}!>rY1~Mg6|XXt~-!A!Pq~ zHP5Y|Y=3?F`>xT!<5t$2AGta03%{ziZ`9kic993Gle0%DHQw16#UOx8u zySMh6GEUfb^_5n?s&4Y7twExRA6B`?#oo#)`Lavw*i5ywng87kq+C;%iXFZ1CPeym z2}4hH?zOgW6|=fxk3TtcJFd_px;M#lZH)S9jnjw4JXgJ~IBZ#=`|ZxZZw|ATolnqy zuKG<&!7I^p`sdBxmhhxID<~-~dNXnBZXXwy);9YSKNoUXBpj2E*&%wUb>9sghQjLJ zid$T{lJmAP&5*5TIH1NT&$sAc*QFqq=I$la)x#=wbMMyrkahcy#J1H21|7;`e|E@R zKG5E5k>og+k>OC{pOd}$wJVGh*9)pgGdx(_viSh_;R*T2#a%K^2k zKld8rw?8rv752dWs(P0%73_QqvmrIh@S64sMd7Nq06qy;urh>ZNC5d>rKC#j4Q5QI{H1z zZ~GkC|98yaeZ75O_J!qjrRCS{R!A0=tNxANUjE&D{tEMVS2OD(URk{N+I)9m|89ns zJif|fRY6k?Gq-q(dwH#_U!W`^mGyJ$&1-jd8k{pRJgs$VtLg63*}T5Z;pxwfGAeFe zD8DJYQ<~M_-_G;@&G-LYaPNQYgD|U&5Je z+SM3-`@{VIt??2cmK)ks*1I+QC}7Rs^02^pjZUqf%?j6K;cdCj>y+xrS^g1KyPtp2nz8+^>**P3Yg@TXuSWH{@jArE3dYZn zNMAKWc&GilO>(Ah>pv~2^ACPd#o+Mwan)0`h3_YEH~hWJ_&RX12A9`T1&*f2d$ff* zSBbv~U8a5dee_Ww$KX}RzP$N-q$u}xn08m_qKKz*-;^$|oin}5NY-Ip-Y+Tjxx23e--YYWVoJQdsncYEh{ zREW{xGiUMh=vs}?NNKVCOWtDi_@8=iw>EE6N%h%$?NF<*UH$Xu+JEnvF1|3zdoh2# zMDF^Cwe7ralh6KW$-VR1#c+-P%r|%SE;BmcSN(n@UXN+QHm~M&eaoI(y?M_UQ?vf) zj_~bAHmSU;={))ENZvh}NlR`%y?OJLWpA>m2;05l4KdlJYO1rd=QV?xR)NO~^IJMJ zR)0vhye_J2=5p{M>*D+VzZ5w%nAUw^KG1t$PV`%Guc>wOIT?JuR%{eyQ{FHqdfKYe zADNc_40_7n{z#Ll|MsBhzS8OyAv5M2dHU~$ZpJO6H>T$*Cmoyo)gt@&RmUw`m=3&~ zb>ow4mQ9v}MNj;!q{-Y26&ppB<=$Ly5LmFM{*`6nYi*7?&4XvO6INx-pPmC9X1EZZ zX!S6r`Vu(2&3sqxD%q_iAi=}J=DeLvxxAf0V=5D<=f1qtPd)Ntz4F_0mug?VU3Fv) zQ)9yh&k6cw%o$eqGVLOS_sN#cDPDT!k)8YY*X!$dN_6&|>VJHG#+$o;y*m{%C8z5Z znMWJMd{;-0rr5EsS@|Y(84d z%RjVTxO>U_Hw{6ZZO%KynHutIXM8zdIqBF}hN!5-Dw*lO3$`%6SD!Owy)nZ9Zcg>H z$89POany>+U0U@1Uk1zPZTs##m@af?kMELI-&#*j@ro&Ua9#Jty2vFWE-u-v)|^vj zL&pJJlo$*ierDFF4hW7~W%YN{;rIMJai4F@dp|{Zb*L9ZbNz=M_8;ff6?$Ig%rtp* z%Kg;s_}7O;oE8Q=w`S)3?tZI$PVvuw&))y6jXu9~+OqoBQ_Oi4ip*b0emr+N{lhHx zJ1SE$)BoRm{rx4o9)G*j!X>w-Zqs0_`1i&)^w`qR_c>Y)Up$qi+x1XRj$L4v_$=}C zOEaFQe2P8rbDnmIwn(Q-Z20jl{HvaHzmw{{^`ZOJz0d28J>K|pClhE4lHDPARov%I zDyMR^pR1m0aM<#1Q_ZeM9e(}o8mo+C89{}I;Kf%3S}ieCw(NDY*?fNfwnr~h9zRrH z_riOJ&pfSKgN9dLGtM%6h?8fyGILVO)EzIwZ-2;&e)BVob1z@Q!JD^35@+ZdL{Czg z9eywR3|RMMAActmqQe=0l6|X&&>8kGvg^&6KGchE*m}eL zZtS9tU(8kCHnSkrT?`!wJdhTod-?r<~O`odsyfgUEyp&jVKUOa%$m-ng zFIPpm%~xGqG24Guw*2PMf2*(A-kG|j$2)A?r$i_$Fxl=yCkdSMvQ+^`v^uY_GrkKRbS9NL7zz#)s)xTd@Q|J_Acbi2aUqWqVGGb%9YP|l&)GQnzDN$?{WTS^ae$+2%z46W^vM>Hp&awavqpMc;3T^TahsWLFUc5!beQm`?Q{#ziZg{V? zxXgFmz5D#a3Grz^mZ~kf`dHu7EI}L8F^j#ebKL&>-zVwEFU1=z7d3_s9H_ju+S&MN z;Z)JknSXy3uVGrmdhLCD)w0fWa~Ruktp#(AZsh97;QcUNMS6qiwZt_{ zi$G%+9bA6X?tf5ZpLSO8S)9v$xA!UBR9Up>8SuPhj7_waqO*zAe@M?sG0=rCic z78N+V)iB*>)Bh_yGKv*jEAFQJPgmIcgLBOtT_$jv*VVe-AM;84xYmNFN&X_Bv4*H# z@PGwZ=$}os*JjN;*{Dz))fcwjNzi(=hCSF|jr~twOymY@7hEg*O-td_oH-VzlZ73h zt-G`8-jRPSpuW8J_J6{eYd75OEMnci7E;c&_U`54;yll!llAy`>6uQqiOpyJSrmu( z)v(=|-vBas#et_sCVDG=_H|fzU|p9b_v+FB4TIAEcf)U|-T!s2U#Rfg)2)tIUIZ#R ziEMQ4wNhSoDev7a1+7v6*C`!0vRle+w*C41@rGEc|Fy>*saI2#l@_fz_?J;>5!10a zR_|k#ESYnk99buk?i>+*GiEy^9$j2E<=7P|GPoWHkE?m!zxT`UkFDi?P1F4!zwT7g z-uL{7aDVc8#`^u8^)4Si3Vf5gl>4H{-sktnDWc`?9=tc-xLRh{s+)bRh5FkbRWa;; zA6eK4@<@k9^@ec9Krs(12?w#Vl!psgU#s8tJAab*EGTfcOx*PL{)CPWu}Ar(X4*m@ zxS91VlJxa00;gZFbP)Kkg3+Dttb9uXmqqH~&1WkPvUxfgF3>&v(M@FejZ-2YVubz7 z79ZpaY*BeQ)y!tqaqexFC+`(Mnj|dG=OhxG0txD!Eql2-HaV~3VVj^`_-v8R${R<{ zvApqjSS|j3;URW;Zh03Mmnq$wo}6f%WR-DDHT}&`R(3w~GnLMK`^jP>r@GYOQiEe)@0@r z>FGvt#}*Z-o|`lIX4lm7Jewjj&z|i`vtl~s)wRmU-NEH%qxCeGogMe@tl4_LC0_RM z4ED^%+`cGZl18&9#U`Uiubc`zMQD7 z_x0f{Zg!uO!gF39e9I7LC0qS7fOVTj`g7liE6$<;D+@{!&K=Tbz7gB}=(oPNX#wxU zSnImm8~-pt0@Cae4~O^Rk13zxwwV_4&7J$O!TWXM-t4K9Wx?`-PnX`U65+g&+@PW6 zzajL{PPrN1k|#4T96j(_c7t4V&>`dAfYpW86KY%|4L_8L_sKY|WMe#Rb+W( z`=pMJAB*Rf=B5 z7i9^b)BeoQ{c(r;yv8Z*XX>ks58Z42U!5V^stC3%XW@*8txK1lSRTFc^Gcm;4er&h ze45RnmvIqUPL_e$TS%#(I+;Y<4ws=8?Fq5G42v_GhwSp2!y<@Ds2!mDIfFZl4m zuc>v@2YU;-puDZ(?79)ftN$~c&^`2#vmJzEyzhCJ`Zs^J-|KhWz9oJ5`=V{Z-&~Eq*FBV$`&hQ;UPtDZ{nxUq58f-f zv`AC;?d}J&e%!iWfAjC;`H@cBopRS(^sq&%2*n;R5)u>?T4SFJYi!P$E43te^k?nQ+MQLf;Be8AfPcxn z%M5=!oIOpM&3P`LgN4l6|4ZX`x~{5SbF%2hgZVsf>NlC1#W4lSJ>JJ67*v^&zsZcpTB?m?W>BtfqR{~V)z*( zb{Og8uD$!MLD1nrmBGHQs&0kz!3tu!nZj99Tap+Y1Q}Lb6=G1_mM3zw;M=^9b*49e z73Ck#pB*dTyLIohvS~3&N=l1*9waJ2Z2uQ^>*hPA>8*z!2QzlfUvP4&fATrjIZvPb zirHcm`P?PjH+*ew#i<7t_6DzBuB_a$=dEe`&xW|gfy^svmfX2n?dGS((VZ?jlda*x z+JFR3W(k$7+MDZct;_kj_2-3&-#*DtH?zx*%mcOPI?N6U@kfIzgbt1C1#6hJDlAJ* zDL+>eKe4l6bIh+(PkyktygpXA?&yZ?n_libcd(J~tJukFN!LTCPyZic{fB-1-@E%h z=GV-#ul}vazx=$*PFKsH+Y?@Qf77ZBE~%1?e!u@sS?wd)UpulNY_hJ>H~LaIT}5{x zH*?^+$9gUc6T5|<^484-P2hHPd=fmarEtpBvi!6AIo3I6#lq75w8&=9$gs8izgJg) zr&IONg4Nz}Mo+3Pm%UoE_x9C)Y4g37n!LTd{QSbzn>W6^ZzU@pBfH*w`}~c+_wg?C zmkfFTT2Pgi#KH<)_`iPkNDdRsu>$O{* z4!&BNI_u%~Ngda?>ivz@9hlwlTzX|f>aP~9bcY3prp^7o&%0CWx!cqyIUL#DpmH+s z-s5@9f`NXI&;MW}z8MjelW~K$mFehrd8xB+qVr1}79QA8U3RjAor~3J;f<(;7yi^d z@~#mUIC?X*OEf@ZLvXY9-|n0#;D`k`vYxJqv2j;EKBqV_oqy-I8?Mb@sZH|y(Pj~X zAEt`m|Cy}+x31>l+{q7~Uj9*~bh7Kc<;NqBZ)6|1pZ`c+u*RlkZ=373uYYBI&L(8B z)%|~SD9<`XtHe4ixZ~!Z_jeq(%DMBM{g&^sD^N-4R>hxgbtNs2H=!G5yxB8-uE(@) z>w-N>`%>Dy)pnr``!-`AnR|KWIz@>^p?i6b-EmF1>nEeJYaS>7(S|Mj8l zw?ArX${xNoV91#`ZTrI9+X`I*t~HO?8XOpsre0!k&8y6sa6b1QQV(0XU&nWa^$lRSB?+=B)NU*bx*Jp1O){}Ipj9y zNCY0S6V|g7?0vMs)U!!hEJpIcMCXeC&Cuq=f{RC{^;CTLto7&dd<{=qj{|3CPY|+F znp3VIapc+Ajngk`xY?|@wv>CThsXDK-^)Mr$xi=eAnW+?ufeliXo?a5zzR&fI2qIZ!}QFtG1|;psNZoTE$aVu~L&XjV2A+wPD( z;JrLqUw+jAv8QkLaB5$Edm#Q_mxs!?if0zP-gd7MdVf}7w``wo=kHQ&hB=$oY8im4 zWu++PH=z!#TKexNpSWwuT4esobmEPf2}k9<=Pg-$=i;|6=Y=b@E=Nt9bi?>ras8vn z_Y;BwHC9csi;C~!JtDPBbdzoV^*3w8k7@<333_kv>bps*)~%%z9|8U+*0^ z(t$9}=T#s6vnAt~$W>X;+6Pfa=usc5jBD|RXcBg2{B+>U)gloCbfom>ZH~IOu@yM5t z>c4ECesUIIQ1}JwK00`pLrJjax%+(KqYMn5vp(-I>yWZd zOH=UN{5tOCaqr^qU%DEj6>ajJx9Uxch|AV`xN$WT|MbKo%^ob}$~!LguN7*z8Je<} zFNS}?Ig9#IaAvs`@g~%Pb)~?&-V=9?O+U4Mli{t?ytdNbF{bXi+|zyciuFDx*8a8I z`)%Q+#?$WtG^FZJ+e^OL|0pjzpXYw}Ex((Le@Y)IHCzh18n3SB<;5AiqV~+Qe^-7V zJTUWE`q{bpUsdCD;&)Wddb+USMAelqPt$E<_h-xfyK?(i(fU0xzZZA~ukx&!)b@H7 zyTfDSXG`91+xyC<^3|GkLBF4-+wSsu`*Pam&hQs|vsdRvX8kSrr`P;z3}|`wwiO)&TqRelYU?F!h1dW zKO49&Z|0r8ELP`P*#DG*Fa5U8>-a7+*8cjX;?-H7>*7+`X8*=gMP%0J8`)<{K&vQZ zf8_hQgj9$aSJvm2ntu9stN5O{!PFeRAGeN8JF6NS;>W%}pvJyBnQLnLR`;FW3lE&h z_!FuiaO+#W-2YFT=XJGj>HExlyzc7Fue+Zed+x&^(xvrO?CIJ4-@6wrxEX2xbNhoc zXI6lMA?wg}{sXpe)?PKA$$!n__bsLJ#s6Q|U!TQy<;(v2)9Su1IsN=tMCi|sYsQx* zFO#`+?be64FZPs*9u1vw%>KWjiodEszgw`qrR1KU-}$dtUuks6xV`PTw|8h={r){i zFUha^Bm7sRZQZ9EH|E!x=hrO>^WG-@W^Vqs-hUh2!`H@o&H6IiBUDj$xiph`(_ZnI z^1Ql`ub-Dqi;sSDmpQrq(@D-tPiFoIOS-%yQ@nRs-6yvVuglN!y7Mlw*gj1p^v}#i zsSo}~Jxque7UiqEAMU&`V8geJnQ1?kDlgi4G=3_N)`wH+{bE`vl7HV7uVGrWXWHet zZlBZ4T8cFiF>uyHs=f?hg8@5Wh*rXIp!@6vuxD! zSy&ang)K69`{+&fWxI%5S8nXgoqh4*YbL>qi+1okhgkfmRR^`aMLXtaK5y=4s!0*4 z77ci)xuvegcxTNrw|`U5-2HLAdQ4UWC-^@fl)7&|d7feX zudPa#H>ykZN;y1Lek%M}-lwO&;PZQV-nt*pPARQ4y}`C_hirQEaeHrb7sskLE7^u` z*JV8K>)u^==&$y>g#jX$H>zf59G!jP{k4@Lr|x~$`^@-vk0Q&ZCoAu$xGd(l%f-mS z;`A}}(w6RZLDnC)eqQw1$3kYSY5BTcM?wz#SnlRBW%`fLexOpuWs35R)e2jkc6>X- z{DW!YYhK&Q&COyd+w2`<)|uNroqO_R!sE@$x?-b#Cf2T!Ygk;Za8^reYEhBVjryCt znlDzJK3%^`_Fwb$e|h(RnA@G7zqfXJd$?F-zBl`8CJ3Y|03Z z{HfNZ$RC(snG;bpug%JqVe!k9+uD4K7i#YFnpKurd-0v*$E-4sCWfU!J6By20@oZM zBCriKPL+7#>*~`xjWQbV%v6y6C4A(m%ih3)27eX>OqTQ&Kty`;(CO+}yF zE)>==G`zpPp#IYQA1b_Cqh?9$ulN%g{J?F&%llUSk^bN3$zRAa{j__ne$=@w^5y+M z>OO6De)sUB@!R9M`VnDbxmv4lw)}njZ05|sTHl|SKEHWollQ}Q>38n=kDFFM?zN27 z3)Y38| z@|>G7-&9ZCQaYi2Xp^y7O5xtXd%+q8#@cz$0rE~lCfNCT!mky<}6@lqTLb`b0 zUU@J_`CH8q=2oV|?{1tv{rAS=`My8hj?XE7{IVO?`Pe*Bz1P=Io@=d29k@=43Vsvn z5R$Oz!>T_;spoSzEHBPi(DT;n1vjfR6y-Loi34{-?#@4U`u%b7dzPGWcD?J>C$0H0 zPuSn4Z!g=QziR&k4<2{Ek?pZ_sx8}}gQC@TkJuUn{ogz_y*@{D_uGJ#7v3JQxqtuQ zT6x7q^k*~q-TaVa9Jj%7QUFiJ z>4H6iM>V$vEuJr1myp6^uiO7s_rRSv*7-XERTgb$4`&nLI(yz_Qb78Fy&B7uUnY5P zx$~p5BV+H!{@EQX4v3^$HROaoc>LtKwpq4P<#zq$+A8~=?@C;H=l@s>Py$6w)hn#@53zFE_Eb>6MI z!*|%auU+dyI{&$^3mytAYgm6wk>kR&qmxQ+7cP>l?)|Zl?YV5lJu`LT{qp&@3%4*n z`WwkJ>6qF1Sx5ZA=}`Mn9IFef4*$99Cl2O2XntB??|A3f_hSo~%#CNgN(^%{j?JE1TqXJ^!FX9?df(&nZ>~wR(|sR-%4MZRq7QjETv~PQ*;Y;R-ss1A z^5RLpOQ-uI4LUkjFns*K+F`@OPA-{xmM|ZYjptju{bC9pYykIoZ1N6Gbnb9V^4_Mw zs30-J*Z5JRQ{(Q5DyvU_d-1W8`*7Zs7mA)09^Df+TJGgKXDz^!^f|3VNow|owfxHS zZeHELzxn>0gC7cVel?qHT&sqZf?1otTP>L+|2+HJAETXjW-9#uC9HC)e;LHJe-1C6 zDr$|ZyQ8XSIela2EU7=4Jo9%1#BwrRHQjNkfBl|{5P9zlD7~QKq935n&n#=*Lx*l$ z(}Y@Y2b#u^l6>=hg8B38w6p~QK0nm7PH7u#z2qZgExcx(>m~P1w=Ax^+%vI#x}eW| z4wviH>KoSimH$PzulqDZ<64*M*3>BP+pGD$ZwOzwf~$2=Q4{CD1L~<*H8*F|_oH?`L zk$UF6eix;8znAMii@)yw!vDed-`c0Nb=-A2Uq?x=nfac5!?RDzUTR*yv70?aYw67QH`m{ofMlU7!D6ICJJj{om*8yIy@dKHoy} zeFVdUb8{D3o7-#EM{K@d6BXp8yIlHK{A*qoCkBJoWdHJQf0q?Twkj>M{BhpZCB)*# z?EOqf9TXbk+;^G$epPtG=J%$9UHtZkHb~o7F)Zp3&#}m8o3JRDsX<8ae^jUZ^u;bL z4OzAgH(&Cf`}(M%((l*ZsvMz$x;zilDw*5^g52+1FCX3Z2wEiiil$mMtU0pq(@KMr z&$F+6KK%YoanzYxClD!K+@reCueKq`vCeQvIg$&$(mx zSCp?{WLd{vV|RZS`+ULI_rJJ&-eLc-%hf47|8w2tlK~nko~t2vZYYh@O( zdR-8AhIn84gf`?gYT0G0!XPH$(tF>mXavfVk$t>(VpTDs@4NY{l5o1+<9AO+ZBU1t@e`iJYfZZzII zRDOT9b*jT$!O~+YH}Bmy?|ZqsW3L;7#LTzB-LkJN+b4%VE5GV$Sn&Fv18b+|<5>Bi zqhV{imrh?IdJIw=X164Z1|&WZy{sDbT-s6Q`Q$sgf?TaR`Zr3h?)p{x_1oreKN1)o z-z)6CxoG{x==s~)-t|wB01r1@zW(B?>91|!w;vs5YjIM%{n;#b>$!+@896z&hX3;# zoi-XwPWG2)UQq9opS$6g`rqSHeJADn51gG{#J4Le_O^B|LyOYFO`9&2o>k31RC;#l z>Un!pcJz2m*klpe@}1%0u}vsT%;bNAHi2>9=bQcQ<>mFW<6L)cODnHjyD;;^s`QUn zRyI%kIw$+1KU?(qC3`P(8@#<-z5j!&(&q9=R;GpLw*QXun-$0-viNmw^!?Vv=hf@J z8Sk}y9yKjm1JpJ?bkuq38Lrl6Hs3y-vIRHD8k5#DDb310?0<91zB^K#Zf$mQyKa;l zitM{ztst_=Hh;5SYAOG2)1|Y{ZMS;*bX%}l;^YVaZrJ{KxZr(s{PAenk3KApA9mQv zf2lQ?eR8h#Hs$s;*JC9$ z)xTEHV!AFqGsHC1!00RA%Gc#*->(1KS3fUrh0xL^ECRj9^5$#(7C*f$x8Hk`k=^CS zI{%$7r%!GFmtXyO^RrFu)6JJN3#uOczsBi6nA#$Xe+mMEf~o5N+=T^2g}!MiEMk3f z_aN_0WgZr$WaZ@E^Cn%3G`bdL#^;0-d|#dyDDc&^ilNPx?R*Ej!-J{=ufIm|M+fq3 zbTN@P;g6AJ5P(!k<`D9tIok)|D;Q5qo>Icv89NRx7_}Bi=ziaj#OP6{&@%+_S zHzvINb@$hSw+D_~7k+%NaB9@jpp{99>lG%k9zE%1BeZ}Qz6DG4=&EJM%I2V%L@slUyF(1vSK5F%GI)Br_2_HFcpK9vdEMquBZoN&(5?!I*Wv5gm zIJlbx=36B`(m(hA*LnUw{}y}=fBVs-_qZ;@tocvxu!C~i>Eq5*S<^(g?0!UCQ@%Vu zQb|ck=~S-gxy!+dr`|_i{k$XNwfnk_rmJ@SIKp@lu^&xAf?+|}+4(Ox7im~PV$jk>v(wKikL;6`w!J*#CcT)Fn;~^ zGqGdQiuD(FuiLrka-j3wHx8`Y{VEGBBDMC{^J-XI?1}|1*vNe|?Jsy6Rb6ap7f6tY=#EX2RU#OS4O^snuogtLwk_x6}HguBRp=NBiMVw)+BqhCN7H0ozk{ zY2)J$ozI2`Bv+Iwx% z#2Yn>ZrZ<$&sDK(On;qW%NzH(V|L4r&>DuXzrP$)pXIcl+jG*DZ?lgrtA8Dm9~jj? ztHpQGckcP;pXb+{3yE5lW&ila&syz$WS{w}8@1$O;SQLrgYi3SL{zJ@&~mk@8)6?BZJv7N&WI{?DW5 z7Nx8I&9h}VZpprk;lTUv%mMEMroY!JpHrT|HF5XEecrXptb`fP`t?@rzIE{}N6h~D zoD2^66*80S+M{&Omp}Oa+t66~@9F>S34dmPtW2EpUh93$YU2W1fle2-8sU%IOQu>e zOr1J)kwta;$4$zfVRP0T`{O?9wnMi9Z_-*W2#-$-Z^=c1c6gw-tXYX8GQ@FMH$Lfq!Rb_x^j`c#wa0 zn2gV&U$s@A6P+JTI%~foR3zN?!{Wbo^Z$GM``*}jXUl)@Tg=gB z%XXV{cFobeL*^Ijmfd~-J$q}^X~*ujthaxJ$DKK&a`wo&Fze8)x9dJV6F%F1ru~?` zw7a3x!hqj1%g)bmzoByF{c7_!rV(ev&d*Rcyux|^NY1aN?w@X2bWIjfH{7l>^{Ko! zWRmQrzfk0%sAQs#KZTgTDak@Cm( z3`dx?U@B9!s7}BJ`{O^OKE!B-e>=W2Pp~bo^~p$fiE$X&l>t}2rHVLOA&z-^45TKD# zeK5@~L+*Qz^*Kwevd}Z$6ZG1DBvwD%@n12<>#*)tsbF=`R@2je<&{p=y$RjG!upAM zZhGpO&5u$R_U_+V|M!=$iq?epzq>Zpfx77(8n>U^E$n){C;8qa&igK|m96PVk_|zJ zCOoh9tJGnv?X{~@wJy<4slK;t{l(YWUvk%PJ2`#nQ_<(P{m;Yxr|ex9b-jM4{DF-G z$uoE6wM*Yt9kzWFs(oU%yaHpE-i&j6JIK#od;gc! zy;mOdXMf)GdC}vf)7`q?HkUEjKCfcfVP9rlC7XI{)2G;{zUNIV-E2O7>EvYKnBCHM zj_-WO@v1Age%|(Du#K+}7S<5~?@28GW@W29@7d(DtJhC>V`SW%P;hTkt83gIspo1D z8s{N%u$x4yMRg(*WfnYRHoMFgy??!1QhF1wob|-bic5~4TDUdgyz5fO+n$`8+yCXNXnWt5 z)OA2 zQZnOo-MO`P9;IFX_8HRJm0*|s^ZhDU@h)?BbDC{?J< z%Uyo^h*03>Smoyi{fFNfT#?MtzaiCc&c@UT-X94)yWsFc0}-yC`k8gzhtwPeS{hd~ zPxNq!Grzwge)*UYo5C!gJzmU{O5-JA~( zSXPQ$39sA9^`J#|t@d~IxQ!k!Ugk>fFp}YFP4ZrzV4a$8m$=O?SIC>9ru<3Ba}rOf>BZ`cCrUnr{xNU5sG+63RiiC!`K^fM(KnZMc4X)l zu5a#`rgyyF5P2)+G2xCTi{E=PzF964*dfcXAZXpc(UhK_K5%Sz@>8Z)+5UA7s zv+H8To{j(i{(JCt!CK3c2EXg}?|*yM?Dgeq=eAohKG-jAUpF1GrSsU4K!KvWbK0tx z1br`v-1AUO_tT%Om>UAzPqHD|YFhI8rqoI63!i;5%$k>cIptK;+}$T9{bMPV*`mOE zjc0As-rf6uy6pYqu?fqC^<0^MHW}^E%4lU_}T76uHcD`L)x@%3|n;_G& z$k;bQcW*2V5`Mrnr!4f%>8@j$TYVR3d9Jvn7CZG=Nc5ux`bSr~Z2Y+@=S)`SoU5A( zS1mPPx9zTk?rN(jfn>&05&T!HwscN;-p_fgFz0d0pAE;~Pyf?iT=VRYRC-_fvon^~ zUuPZHwq4E~^x#JM#2Tw`W4YiPZg#K54ia)x#5g{c$11Zhn@`F+~lX*JtI*9Qv+zIpeC z=g*(md6B0#6xaVa_U!EW{~uD!SIVxpQkv*-i=p+%-j=@&v8%6E*?rtnV>ZEh;+2~0 zZC8Js`fy2}%m0eYnqqh4#w|u)$)9a2mPmNi^ z-PEPOg@s!7@wK`+zw5ti8T8;T{^~d#Emnj0mD+P_7Y2Oh%b|~2;War9Bo6g9q34h<;@_F@~g_89#&MpsE zCpsB3F)%PVFh*~_#i~(v()cRV9?@C*FInGjOI4g}rvIYe@z*=ifBXGEZ3=lPUfQag zwA}gR=Q-bwCw=VVn*3$CM$ikdi2bq4V~z_5%6Dg*6pOK^8vTh%EJ`=Dv^-K+{K)5? zTv7cK*&jL+W|VD6-7J51*HpRQQ!75txV!Iq&ccY`0^02i4?>~K8o^3kY=K&d6* zgov?fS=ZK-qC0K+$JC}emUgY?IvRSb_0;EEz7y{)(ch~bTy<5& z>`Y`&cqJYvWS%Brr7U^)9BaeTgBO#3F3A1d(#F&v)Oh&rDd*YD2f7Y(adc08T%r4W zsvtvA^^2Uzt$S`9be{SoW)^>YTH_wxIIfM^GoMUgQrdJ?`tN*x?k0!SD?hhAe&YV` zT(aE1HU*BP4@Ea>55=#&8WOf@mz7Otb<(4GH$G21zsGt1j6J7Ud{6m(vj5M`FvE_x z=X=wc4#_G`6kry2-x?j7V|k2=fkA}f&m{)1+h#s6bNlx}l?4=}I}faAN^LG?JE3^{ z<@OxE(@QTu%UQ1^>px-28rda>whEo_|F8b<*xh4S1Rig;N?UuW*vi4B&-vQsdwljD9@OlZVI+Tx7(bRS+;mt#b?Vm0@W7zQM+L|)P z6yEl)q2V!a<71Zk1~)l#X*_LY{u!Ekafz8@^8qixmW5aKK>3tG#B9zI9nLv_?6_(; z!6nC!MAjB}<>j9lEw8eMMP%}6PViW5nP7A{Btrn?cm@p(3(rayqli-lS08$FfP`H6 z7IVo(zAIk!$SP6e)#t-MTlGJ@S|YmsfcI?YdCpv2uj>;RroZkS;MdQ5{yF@PLf2bz-jJ2`8Pz?I!#^X&mP4(R>Z0gQ20RY4Q}-gAqT=)-1#e#An0DByT|~t>rT$ZoCwI`)LvrjOE$i4B7>b7TBLAv-l}V6rE=d{+7ENJItsXG9;#3| zwW&=;lRu6pG<&v4DqG&(qlFvVJ4903Zcab6AmGft^>v#v&HgP7FmgZbcRj*FtF?Vy z%jAisvva*;>KPa!H2y4NXi#l&_A=vYUGwa*PRb7^<8tn*U~R@K1seVIqBeEf8gbdSARDw{itfZcHsx}z<+A{ z7o@aWJ00#`yH|eO&F`}p3;+4CRYUNs&)I)D9N@y{$y>#~Elp@REVS!R|u*nRd3wM5rr2YMk52 z#lXufG;H1VS?-vyG@Y}al2cSuh#Z9!KMnj}6OE+yrTT{zv7NIT7cb?ll&9=aEHdntiaB(G$3|8)?rcdq!6roB$!78h4v$xMcDu7aH`9iZD}+N8hF z>Rj=(Ao%~vn}Mt!cPj}NzMj%QqwYib-fw@ewTVafTF?2@8^f(}>G zX!Bq1qsix`d;H!`p5?A1%CJVG#GHYF;pgEAAa^n_RLn449m^2mJMS`Mny&CpGr?U# z*YdAF?aR4fp1pn5F=fl;lj8hr^soFW@z)W{&(2+Qcb&9sZ^_=v@;gMhT7Q{HeJy%w zL9f`&u@@M1TGN$5XMgNdX1D6M*0KIN_xKxGcfKP@AHQv5-zhxtyN|=(lZQ5`-R^$dS-nU^LWb}9 zi&-M6Y}@Xntj?d#R2;tWx2^v6dyoF=Jg~U3I6z_&tK4p>KnVfRoo}9@kyHz1BBb7n$q_S7-q?2CEj7e61JCxRbr*s`OU> zkYD!vT!)%x>s{=e@!n~}=F@`z9ZU8;R9m#aXTIv9Q(jl&kDV{_>RWc=i*fje?+-u! z<2zn&{_RheLZ!0J<7bwKT6ZMe&;L8${_EGe8%BSA7yOR?8?>WrwO8;;&syOf5=x7f z?R}Qg^zCn$(x-Tt+6hO`R-AXQJHER2mb%Hm^X;+U*=0;jx4Ek)Dc8S{<|>IUm+sUk z7geh7{;AJXzAyKB?&VwGXLX+V{PNB6d6ye^rI%g`UMtBx|6Z8O+~a%K=FhouJ?sB- z|Jq+sZzpb>ypoyw*^{mJby5{;uYBHj{NtvX(dTsw?mHcvtaoS1kFQKy99By05lOmk zboCZHH`k3Ga&3I9IuUbvvj-U{yVL@TY?$D#t(&d{1-1e$RRo#34{R_JgXQ055Z;R(W znEvqHcNy>KY=#Kd7a0r;365TCA0L?fk#)tDeJuZnU)MahD$bv0XfxF*aYb#E^sY?=0f*A9uh{ieF>O>dP+ zAK%|=CjW-BUUr#j&ri$P`|7zj-C|tVfA;;|*RsF+lF3!OwO{AtT+XR05ShyNFSA>U zCyu97_C0^S@Iup`kD0N@3#)tmyj>P*CmuF_IWh61$ftvnDa?C&bP~5S9oVEbvDv3H zWV1)&dj^M(hXiv}7j9)tIGP%JM#a}Aa!R1wHPs!xjXFst% z%>Ur>WWT|gwdQyEJ5}w^ZmT?2@Q>~Ozp(lbry^|Tm9}MdX3aGc>pq^;w5;aazX>MN z+k#H2JYV^2%I3%nt*b6md@fsGxcSFx`Q?k3?>&3>E_0*2!ShJglZ}6$T{HKqvggf^ zyWVlx#QL`5z1I0VB$bsi3mT%%UYvDvLQmz*@3Z^2e699lcUt_Ax%#X`kV5fE!#%3M zg$26Zr^(%KefMR7kW|YGRte~m*xAytpBaOZY^-^3j*^VY?YNa5YUoEG%qzygoX6TjtW~e^aFeEB$^J=PV7;=kKW%=d2Z#`%zO-*xKoLM51k>>66_8DoX#B9k?&hu_7va z^P7^T`(D=kUXZnT)9S_dzwWC3khJ2j@Arv)bx*BQ)2}yQU9ViU_MOAg2__)e6J8rhc=i;p&cVzrMf9p!=amQy~H4irmt+xY3EQ5$h2P};iDZ+Va=yB#-|)3up@c2`GD@p?LsIrb30 zk{~bZJ^Ky!-`I&({A&$+o^5;S4ny~a+m8j7pG+%tRZqJ1f6d$-lAq^%6ApY5rDG-N zTe~={IJw@c`a$aE@0SmJz7}@=<$=b%&pvLn%e=)NLWi~`-fXJXR~f>6z#d*uaN-S*tCW9(BI{Atw0I|wphi*G z%p{w|0U8{yWtwAr1514;XUU4ooZHZ3q0@FKAZ5Cr*Uyg=gVybiS$MiFr|aDVo}=7z zyZHABFLf(70|P_kls8gcs?mjD z;~SPX&E_p?x}3tG!DSJ_$Z#U+;<|U!awz{QtUCQI!Rc~zO8 z@Z~j!Z}+LvQ?ul=+5g^Mxc<=1pwkg6KYDz*zv}yox<#_PZ%yx6cK@Euuj41q*t?7T zuloP}jEUgce|nem*1oZR85N*+bJn>%&i}9Y&rbhm>6Gf?vQ7N9WZTzynWxLu8BZ|( z5@BGdaB;mpb;`3y6>vD{EMFuW+VFA;qk{iYI}XoXLLo8NH%xQ67`wBXwP^mQ)gfNz zHRE5cEyUJC>NujF&u^H0;^w8xIrc_BT-S>@O)1zq=g#K!r_C~#7=5ahyR-Sd$NJrC zKdLU)2s*!h4_obLj}`t>5f5yIZzR93+W&gN`TJ+rrXKq*CM(CceA)bIQGH$)rMT*a zJL8_4&c5m*();P*dgV*%#=)ESr#Br=oP5!;vbyYv%L}iHg*$Dwyu5Y4Ku{^w~XJ1(M?c6gngTitwlkWv;cTJh$=bMh(jwa)&p4M{_PE&U`fFQ$uTS^GuD|w`IUXPxnr+(GeCo=o!%_=^Vz2j%RbNJtgz?itNUnoT5pXcXtW|BEO5@e2kSQP z5j_g&nx(9I;wIV?+p8hc=HjH&l62vUmimmfrd&&=G9>W5{N%VY*71O=@XVt5pSH?u zi!6I(+8{nFd7=@&^Hl)2pbF@LeGJkJ%|<&UqOyXVpGR{6cNk@@#o z9q;7(uE`sBluoxRRnFd9_~U!xtXY4zd{iy&lL-nw9jNK~*gNfg`ewy>{><#(o_SRY z?tGHB>w)~?b7J2gh~K?arFXuD@d?}BPH;9~rSYMezfELH6VrciFQlPn>YWu$OQ-Jn zJ#UBlFTIwq-4+ZA<;KQKD_9q@tkx+FTyZ^xtZ$Dcn3tqs3q!da;JczN;V z`IDpiygb)@{S~1jC)L}s&c$SE)>f_cyMO{CjmyyR37SUbEKQ;yVL_Lzt>XCZpc06W!0Z z*o$?Chs=n$_MoK1b)9d^x|U9loqdW*c4GeB=hw`f&odf{iE`uQ0)`Zr$1 z%A`NK7A?bGy@d1s(wFRP`faPW`sVCBSzA=r(^TNT;p*-iMU&Guul?)0eajt(Cs9{E z^cYVR@U<@%65M`p$@*Ns*dB$idkfq*yqV>DuwHS7j$4LF(BkYz7Lzxg)4U`2Ow{=G zE4G_LX9Cy%T&lF_qP^Ryt-dQINC}qu1n`Bt*Ufd9HjYI z{P`KA;mLzwhm8Jm1vlt@!#KtIo#>>3TP3`7K%* z!q2+vuKe%a_8*?jH*L7HK%SAIK{dqUZkNd;8D}o9fQQf#2a^*8A&&oYu7xd|v%56= z#qa&U4n6evG|5(Q?w=#}LZ80ujJ|a{jrseV*Fvtd_Ly4OJrjMD6cyyW|Fx>p!)pN< zTlAyLs=t+Lo}PK~wsUfQ)dWzG&X}9){V^J3cZ93$KFutDAwIcW^6R`D z`=1l-Eo7D%y|TS{>2uxw<@OUiI+_%=$$w?p&r`nt`Glmh{jV*4PTc=@g}YS#@%wYl z*XgNljhVXZ{Es#BBAuVfn(FMHpeR`RY|_$~lMJ)BWuE6R*|M+jlC{8@DZHTkq7$Gv zXP(DnPJ<;2QbeI6m0oTy`?NaZp1bew+OpMblTM+`VF*+uB)BDrBG(^)vQN_ z6PI=DKgeEZeXH=yxoO5ZmdW?$zrS_ZkJ92jS zHhN30`?~pQ&qlxL=}kLdPrZ24_^s*fEwj$Pns&JN-~FCteq9s%KQbhkPQ8`Iu_Ghs z&oBFr=I3f7?*CZR7rFY&96o`Gk0*Rxv;A;=;g+n^pQX(rZuRd9%~BQQt-C0@S8#pB znUIYKor06T?`9XDzI&rzdBXmknepk5=4IT@wW)tsdtS5NwKel_zs|$e6DJ1b_xfoc z-6C)B|5^9<=EDzH>GJAi7wmnPSF^G&bw{_dvd`}=gZFfcH%a_#40NVvN8T_Z=Z2*cWM(*+n3>|~}hFg(#d>~++&>#@(J z*%dK9``(vsH#JS0mp-HaXott%!f#Exqt=Sm3rv2ksy#I)>&Xk3IUOcbSGkJoTN$eF zo|5!oV?@l_Z2}W5e3O2uaCCbZgzq)l{a-g={qu}jle*3Ay*@G|JoONt6of=N7Cot)hiiu?w5x{J2z3Aj!&N>`(neJE9cMjEMa@K{dJIY(EHcX zWiNGiZ}O|2@bR+D%Ci%LR=OmqygfWC_tq9Csn^d`c6Y>Rcwb(+EV=$@R{hagmYNMg z3SSjo*fB69aIOt|-XzC6=>s=ADEWl7)VPUq9GdXOZSA%Xe-hrEa9MJ1g_4q;*mH}% zj*5Bd*Nk#1pLupJ{W|;S?!r7<_bn5u|C^_aH->4=yz=JA%bOgtyh@+Cg_^uNJ;@>L zrqG$?aVLY8KCFz}={M8L`17J}b_VUWOWtjre#?RDgx<~H;F0w;eN*=@?+#YZN1Km4MU>S++Y*Jzs8qklK1dz^7A+hem_@ROz-g9ulqei;^WwW>aj&<)l@%((L z+q&asA*Ng8OReL!YF$4YS>>=eaQhasS#{5hu3284eMPr@E$_8!-;&?;J^pr6BK3*& zb;-SQYj0h;P`YRT)2(irGj!9N4&M84)#GTgTHfBJKc~+78R@>xmG`_wW>#LtG?vX* zwToAF%-G7~8+=vFJ2ce!ty%8#+r?6f^B*xfBx#qV3@$QpOIm~ z0-gJgoZER7{9iztR5ugWF)>WoEmSYFtwhg$s-JH+_pY21%Z~7$+pz0G>Iu$oY78Q? zRPFU1I3E^vN`E zGj+-Lle^!qY-9-dQsCyh)UcSjtc3A#rJ{*c-kofc$0f?9N;XmJiY)q1S4?w_9sxO|<{ANyoU%bP^8>gXM&CE4=?C^@h||Zf7nl zS@;R}+JaYCe)zP-Yx}&@QOoDwY5$3@M$E&<`i7C3`?8&vca~;%JeHdz4hmQYy~=qr z9z0>4#(%C4)a`gM@#IkrPAS-0fP!^R=gMs=kIC$jSas2~a874*{>Lxu9VfmRs|yxN z`~14~?8Md;4<*x;6qm6r({r2fD{hB!MA=SoN~lWyOAqa&AJ>^3@|WstDI$+eqMY232rX|{XJs8 z4vF*V@A*{2$iUzrW;AEDLj9acpMUN)l`8$t9vAN2|F@y?MfqO;zgr@An7X8zl$k2I zo|c%Ac7C6p>T#cYazd^f_vU_MYb$WyFk^1*-`s6giytTSZ+^PuyHE73wp(jwElha- zCsM#j&BMhkdv)68XV=y$28!sWEq~3s{kMyEpVcn^U+3m!KA++h{aEn%LB0E}@1D5- z6ybL`XAlxUY0rDT>&p)G=@~RncX|`GENZo9+l^Pf)5PZ-YG*oLI5*#V&i)sH>w|B7 zkDj?T=f`Ug6`@j@O<~~W1-1M0)ECX`uX!f>tNnS1+g|nCzHZCc-kTvHY-tqR7RBUX z=)kThePb%ahORWXu-z;S3>!*B+CWpG3=R(`J&a-fc{%^OSFw)t_UlI;Kl;PT{OQPj z0jB-3xxbgrP3?Rv@w;xb$h-Xpr`DwAe05XW^wx|`kM()}>1oEtc71s{eY2{>-gEtR zqM6ybQx3_lkNWLzpAz|EbNa39ZJDOCuj;l-|J^U?yEfVGDDwnMn-h97XHKjPKC!#( z=(7L9^^fzCvpPOT%5DyOX(_9qbX@UuWPbbqM;TYAJvYzUutmOf^%XBAsXvRXtCZtD z&RCh$+`8<@yK??#lc&R5Zs)6+Esf4Dd}KIz(HVukVqyNElnuo@C!CLAl`-EPRAi&4 zcK`dX+q0y4Z<W*ympz<0TT@W-b;(NUWq-j%8v}!7%et1? z@h|)ST8;@>&0e-c+;Ea6Ww}p4R;=-=S{l8QIyO3 zCd1O}+dl?|?#6YXvLP(sx#9VV+kb71);_L$uicHW*X@WrOS0YS{kr_FMOr^hm(=dr z^u0y7JaLI4t8-(VQqX$u`mij)OHm7+|7Cm|Ch8^%ij+0eF2yn`R!#0de)QJcD6Pd0 zK1c|1+H>5oQWb37$F=;J4{yloDJ~{IQZ*_pYo7S_i!7`{ZEnTAo_J_2YJ2Ob#~oqk z@I#r6H-)ZbT-oaXde=S41)4%E3!f|hZ~Xf#XX&IJ_TN;6Hcyn*pB)VDd@W@%ezJU0 zVfKj~Ss+I-Fa+GNSEF=wI1`$Eo|?LK7aOSPT=Wt%eEdkbLK<^3%@%ksMgH7BpVvA_UaayZBp|J zUuDm}Dt#5Sh|g`g+v2>;T$8_NQr8r#B`;%JWxg_+FIsxd+PBB=$R2;Y+3?hf@^!{l zwozM`E__{4e>%H2$RPS0OY`1`t0#6H_qkK${aIV`9E;NRMQ!PGUhZGJS;fO;U$N{X z+s5iMAzM@Z-n z~{sOxfX-xZ>I^q&ebU_Wlk}qI?z_aFnwsJ<9(uEmm)u zY2locUuRi=e`a~ed9h$^u5ol;Qe^YSbCSKER(=e=FCe)533zT;mdE+yk2jB2N_s1a zRy@i#Y&~?L?#g7J<*-TM3Ch_@pT4kXmH6spCqxE+o$MNzd7jD_^W%eJ?n2r4&y|xcxfCMX&x}7TGIlUB525#N^V|i}m0B zXJ_9^Kew&2@54dwg*SRD-j=<6F}2|H`D&@}v-YOn0?l4r4#{HEFIB&l&7~rCPnF(HI0WF zMkUi+$l_5ZGfe{Q)}eCz(7&-3o_N6WOY0R_^O*HgCtdzT#P zw)v*n$L%-Hoaqpmx2IE1hHrMyxnt8`?O~qVS^a4Lzx>Ii<#XT1q`y0B+_pSOgJ-LM zwsZI|qiK<|bRCKwq;5Wb*DaM_({s~-Ox6=KDvYvwkC_D8;$ijv-1&emIeE40%x?mz>Lh9Pcw@eHSB668Rv47Mid%RWH&vr154U|F{8blvj z$}Y&PTD8nl@{!%s$!?+o6RTvE?^dO6j#>E>-{fPFYqQLjXzgl$3myF}Zb}zxye6qd zHr$EyztdyLvy@l!MDC-so{lTCuedA;E8dc3rlNa4=PkG(?{2ss#=tQ1!L(wjNV5(d zZB_;b?$&o8=S-XVe9QjFZ<(LXt$KNWUVJ6Hoitys+n24kWTI7QX8}9;j(p5ld-~zAb>(bU_rGu1pIJX;Qp)LF zMT@hNl+5Hh!?H~?XRAaj^lss-Zw}87;%@S|91^+m)OK)w*`V=%(=Ap8291zQwrn1g zq+HT+oA&OhBHT4elTVlIcZs}apuZP7gxF=oy#3xIiyO`^T}FrBcqayEq}>m{EmZHf7>>hyjeewpNLp-e$VD<9cjzlmRt|mFug-9pZ}~+Z%_SeRi*pS53*&i z{+s&x$&&|b_w&EnmdX1oEi<99vfb{((-~88K6rI>IEAPE=ZTT3z48k@a^a9!F#prc z|BI(R-jUJ)n^06^_dkFA?&U=xTHj?}2-OL6W@vo)*Z4Q>`^p2K^|x5Xzn0uD78{dT zRW0+#+2n!i=pJbB*bI;F0dZddh1EAuDaC|dS8m)-aBykqBFoMK8mH>JL{ zNO@bjT_Di;vEXTLz4OZ(dvqtP`g?X+-@4|5+7p-8?NYa}xpuMi!q=+HkEB=_rg7`- zU}QMam$Xb``L7U-jI@-k+>8vaPKgy)EPD;LKh=E77XEp4g+t2AP0iB}pL4$ZzWzbR zhHdwDeVu*tb$0NP+zl3SX616_XF6?U%p~Vdp6o1hT;O7b%CC^K^IViZ>o;yJc(QWV zv;BX5=6szj*`~Zi)irp@zllfxZQA;IhOOlBO{b>{9DVRK?*8+G&zfTo%~e#|^rqxv z`C~6t;XQY}UBFEv@tbN2m0y~T4+uHwEAZdwXV`G4ppuKhA+2E1t}P#a*X&%_%9xNk z^-c_Ha=0>AtK!5HRst2Flf1l(|LuwE);?J@MPPwQV#eE=Ptm-L)s?9`{eMRB-PVCF z-cO(JA_?tOO3SN0m72TlUF6)8Z)EmJRAoHb_vN)+4MrO624<|k6jrpD>(llf z(Vsf27rj4pI6s-eVdBBFZ9kuEmufn*D)<1=E8ckR+|T^D`{R#H=&b$U#@{XV zo|i7>UG4d^aC)lvH-n@nQCkk)+I8V18^Z#Q2h)n(jAn0PsIGLa@cW&-vBI^rGnLoR zJ^aZnmls|$I;OmqPy^$m-@Q0{={<&;ELzjXKJA1ZTy+-_o-==nRg#02&A06AxSepxZXIXux20)T zWu~B}HFyfOm`nMN;5V5UT>t9KKBicl=RVgQd+>gHChz4Pw{P5ioDivII+6YT(n)^| zAK6@yojYSiZPaty%L~JbSMEHs{=uVJ;tQ6j>W3zWL}{%wP1)QxearNxfzzFyT8jQS zJ^y@Iw&|t$ea*J-g6;m6#hw+8S~}@to!EuzS;3FJzyJFwalTMWsq22P_hbH|%Q<1? zGMmjK`c>X_=2SlW0a?@bKWRnU?Pi(3;!UOJUoAPeYn|Woe<%E1bk~~-1>XH8b-y*? z$Ltj!cg}JRm1W?P==;yWuz`c?aMpBCKr%2SsDkE2>~8f}otu}*&)2_o`%YQ*wTEO6 zCY62ry8Y&>-o9qrbJHf@GtOQ4@%x+CN{dcLH-nZ>%vD~w@cvi3ub0yvUJJN&fl=vF z-c=sf>gVn6Z(d*eWX8$c&Wkj*ZMXHfla_lm=h~fJrYc>Fj=m|``>qg<@1FN> z8o!+rl$mYw$mYh=-52Kmd9hHGrJ?5J8@^vclP;f?u)MnT0}t|&dtH5tR({sL$5!{t zEb1>Vj$6Lv{dS}5n;))E^iX+ak+OD8NNH)sue!T_F1GSN&scBLa}d~juHEhMv$ z_jUQTyj0!(+jZOJ(Jw;WK%u4JZ>+pJmWhEO!b(D$je%jpT%K@;6YbmguT7hMEh1dF zzuUz1ANS%jQOCmaRg`Y$B|iu-LA%V*D2&pWfpJOAd?(ofA-YOc<{^4Xl7;pc&g z@(c`Nv$xz>x<%&sD)HohO7pyD|63JaY^k&E#EK~Y4_03;K28NCc<;)B^wyu$xM#p>J)46E7f&oMGQS?Ut* z;E}x6Tqy8&pudu%i-}z4vbw0XS2MPUm6cZfkgoYqbmM0fzhJ6#;hD9;LV+(<%sb4<4T085M*VT#JZ7yoqS7<(&B&2=`vtOO26olMU_sEdab zCqRkQ=FH^zy*Z%732vA-{FE!3^}z07{LH45sl_wT{W!YT=z9g>WaVg`9 z?%LjE^LO@?p4-w7?MOejM4u-)_Cy^^zd9&CXuHfdvxw;1{X4DuZcm;#6K$HLk2O?) zL5#nA?&g^@Cwe|Uu~>|OVFJI*XGR7E`AVD0n?L*1%UR}$=X}-cGcJ6s+t+N{d8B!# zq5FS{mDkKRt~t2l@X61Ia+;3Y+^OP@&fD~+$Ww9QMUUQfosWHvSuHPcS6H-hwP5R^ z2eKSlX18xy+f19g?wk4DlPTFHzWdHMOPZ@FJ?u-k`84UY@2sf(l>j&im)EEl5zX-Wj}rKsY*Y)Ba0S*G2|;dY+X(IAQHeqj!(4 zxLguCv*Z3`&>{c^28M>zr86{-{Y)3(inEEdwW*RZ{-$Kxr;d=zw}Dn*MAO;mfH9K z-yXNc&%g^FANB=oUAl1n{rmF``#AFY!V9W zyL0yZ^?A0JC3i@a{9EKM&^D=C++|-ks9x0c)!gtcGxj}u--8bk*RB6H8K|snFaWI- z+gvPEah~PdpYZUa+x35vHOhiLve`9PrUW{NE4}LV>UF#Ow{iRG#rBa6TY>}wd)IX) z-Z-d#@A(uN`NxuNCvWJi6#9PT;(Fy{RAC zrGjAtOTnUDPd+@ZiCkFecu$1OwXybay4Sz?e8r+qj{eSEkk#G$*hhL*&X%^fe?L6P zn$E$%#Uqz{#!+sv*og(;@{i$z#*)(=-i4}$RdeP4YF)Z^>%^ubg*}f$v;V(z_;eX< ztaqtqkd|ayqRn#V&XyJTmZ&NHZw*Y-OBFWGcP`jdIffqeJdb(zyoCEw4V7af;Xx77Rpd#g+j$9H#r+hsnsa9e%# z$m67Ut(<%Q=9=E#a%|VE9K)$|CUv+NepE<_vtDvB|9X~5mXcB4{K+{{E068(ZQDQd zh0VJM*NQ{jUirR~G4)D1J@cnC*Cx~0cd>IW{`os^ivLG&Q8Ml7tgCtsg#~->J*nE8 zxz(GIq1AWS>zG^4SBoY({ssrdhX9LP;?{2*86wnv%0^q9Q`y^j{OFV4aplp$iw#Ys z=)-{$mNI@Vun zdisw(%G%o6aU@ene$9Lbp2J@G5z{talioX@wbcG1Z;h11PiJ|-)H?=NhRba-_oOo| zT(5M$f4;9~{k1z&y}m76s}h*|q{zMFV_{pOMPGN257*55e3`R*+!xvIm+FXne)Njb zS?y3AF?A*1rCRf)o=#i)Qf^bX@vQCl<@Z*AJ?+i9n2Uj78sEC4=hJHL?5~*3v0DNp zv4G`it(d~ub^iR(jE;K)U0rH)&K1fCezZBiCUprXThK?F^)bs+BHKE8N_TzC-}~0x zw)$HsXE~cGsAAO0ENzx~Q~f$eU+&`n-C>`1Ec@ljE0}sGU}Z|sX=T6V(;N%_EqeaO zfqnbGg9;5c#q}=#xE&uCzbs~6veo&OduR0`$NP8w=5-&xtF~5if^KT2jpLVm!^|Y+ zsuro#>|Hfwg8=k%L_g}|RP>)$7V8@xb7SQ^>1Cu7bvr1m|Cnsftl+(uP`x8p` zKM&R5Iry+3YR7x0fcV>IHmPm96S6kgo7N~sZ(69G*m`Jz zhOx#eo>^zj-XC~#WkK_Fr;{nV*0ISCGm0i3>|U6aJ9*KW18cWi@O@Je7Gw$Zat}-k z(BL_lvU+}wm)nWCKPpsK1xQ%+S5K;RUH>^}XJ<#za-G&}v)eV|&wO%c)i3S^FXDT$ zWaT#T+q1uwKHV4%3hsn?sXHF6ytpEJ{vH6? zQ-+C?%dAs3cR#pRr7XBr{;P_Ri_7DQFaE@IocOV3UZO<0w|`OEzaHtZe9+d@zCBMn z-F_bQR=l2Vds1W;e@W!)-e2|W1z7^CE{5#ex%|;J%}$Lkp}+iZ_Ow_#{hs~qf&Ah3 z^5sj~&gZvZNm*?Evm$2A-E~WixcK@7Cw^$2U|4%Lt@Q3@tLv}tUeuVsL%lDy_et>L zBesE2eoCR+mYv?#eN_vz&_RHc9vM=k2kzsI1nLe}(S9qv?N7Zq}SXy@l0h=heopJiStH z-9^Yc(%Sub(JtOhQ#53rGcqV--jrMPY3^%*_ndc2`~KX$wddBPX3Sc( zEn?LwsjTgp*7wTwnH6W$ zZQs$WfA-$eb9)jcf1WFKTkpPln@Nf6`~1qahBF-=Y+w9$IkTwfvM1VKN>%RP3C=Ki zHSL<)GE~X!7JCT%exVf`Z=ECS@2@WtnI7!pYQliFBD&mItg*|gyi??OG;9p z!NUa?9{PE03_K(9_>T~1pZ1zEMTP|)8a%7bCh|S|P`P4J-l9c%f4WXyN@dq?pWD9c z{{I6P6LR;KzBa$KWPyq69k%Yrsm0Iluup<4*9FyhNNc123vtA9O3$0w`{uXJjSr6| zo;9M*}+~jcn|*3U!4p8 zrlr5}uU%<;O{^u<#)A0?GyBg)ZFkujydNz*z5U@Q5r&2{4_rzu9~}Sr$?=C>GUe{FuM^o$x<*PsQ9>k63f3dURB_F(2?cY_Ypt>y?_;t3&I}zGGd2 zF#XxLnh>M~xZQpqAR|S;c5c0A@#nXJZ(y%q^!GLAQp)(^cyyKKZ+ySVQfT^@+Dl?{ zJGPcr80E~5g`EpAtxe>@A}QS;$2V*~YWu^r{2;F;14BgEi^Yr&E_zOX+5JjN9#p0{ z1bX>J8GMh4Gc;Cye?4pK_eE3htYFH_P0QSwwC&E4^|^9;M7;iH{M&T)W|-ZyMJumP zYZH$>7ym`4#D{@l3QNqD3aR&ZVQT^ERxFC+W&B+ph(7ux{p90rrMvMGUj;*LzU?{q z;)>nMk8@x5-S0i`AGS5l^RmhjRwb@~>#py+f9pfi>caNP`w!}CEN)lxb9v<(^S)g- z_WhUs*xo0xb-|E>AnwF(ODODpR&{sn|4y^qTM-N=xcfdZFf8Tq{|6rQS!1Bn5%3|! zVwJ-DOlGxw{?xW%siS3g z@uc3notLE^O_31{lq{9o-2eY)jgDGGT!HQiJ%0Z=9UZg2&0Kr_`n#LgX9|3t<(cv6 zTfp(#>}~DNoiA_x;LbJa%wM4VrS!nG!*u7-HBE)%8o$W#{CFE1J%g zf0~;ZvG&=n`^6FS*V`6tslRx0<5T{f8z<(LGNUx>6O86OXN}(5{n+PDRrlkB{w)(6 zvy?J9`~D#c4Qa90>dda@Lk@V29{d1De-4-Tv}MU zKk-SR{*vaB4udn>4New>9CV6&-3wa&fA;s&1>nWC%kD-gEVBK*Ys%9zPu?!vXkXd- zqxnuQ+M?bvC$o3xi*JSAafof+{B}jGK--q6-px;+2wml55aTnS_c?ISV}XtJpUo;X zkE}~wwUz(blkKFR@6e!gdc}7a@AJR^&im(}q{!8Dqwb3EAEP^e=QVdMx?cHyWp9`x3@fJw~D%N z@luu}?Gzisro$U$84^U-et7Da`D@FQ**5VE3<~z#uQ-anaCoSfmuogxi8@(j8iwz+ z@nCmpO=u8wPGhQ7I?_*MP0;^UiZu3<(rw`X5~hmO)EY9 z(CvS|Td=z8hj@w9Yew6ulm%~=Ni$C`ux3mMJ^SF9i`YxJJDZz5c&*f8lmR z(<5Z8$epq>cl*abJHOj5|0628jMsis%X&9Ar@f|DYrm{S9iV#els(1zqov{N-rnl7 zKbPmMxh#7lKkwG{o1gC;P?FL;xyk$f^Sqm%gBz`xVa*cWE3Yk94SFY^EOUJSqn1A#Cck%| zmUMoOz^ZvNb30|ePV9zP8 z{(Qlj=5=RWrz-fd1kImyHs@P@`P*cl3KjR-`d8xdWrYhaZwR-xwVfqT<~JOw=Snh4?31z0@Yo5bgi&B<&FW(XjegI_tbZmxW7@CtD_M zkuiMM$EDaJ;Pf=(T$!<@_Bn9{>v>0a-O-(UI&Dwed7+)>Z2ujf_OiY|jeqaXj*tIe z$2+U+4Dr7gcIr@!~iY)@CLi$XZvd_HA3{~iI{vL91+BW-6Ykz&+FW}_OwEwE06Myo?tdGUV zHaDzS`(t)GGq>ivy4unQ(*=Vc*E|!fUa)9W-m}9Z39yw@0g7&p!fusyY9u2ss7)vZlaU-NIy26@M6g-SwolhMXy=?((wN4`ydcj5ZQ z@^cZ44-%K>o>Ml|Y;|8G$(>zpWNLa z{s+J86=sImwG0ghra!!}HRHIae^tmk{@P9#qYYm_tSOw@+pEK{W&S4>AqIxWGXFp9 zZWf4QDH3JvI~CniB(raa%;z2fCl19er*!U~_;d95<|V=t7rAbn;>&gC{cmymOTSs| zpB?{u##}PGn}2@ZuYVb@QvXbL`ibbMO$LUieraFU+p2hq%xtgT&*$sk|L;@( z>04D-H=p0iwyy26@=3n`2D{q?oH8sQG#j-9Brdgi>gdXwCPP|NB+DV<%3F8{`_hzI+uS%@EN4V#eELZy4^Juelq%?ab}jULRtMKAHc> zwVt)>+?U(_GlH{grduuboLJ?uJ@+`{S-qvNb+s8TL}&gkOrE@P>)$QAKliAL&WP|o zAd+)C@y52bo}0a2)*PNSk0a8x#mV;K>pN}kC0Ep(PfvWe$eTlP%aJGZJ@+ipbF(x% zbfCE#6fRQ|C9^&nU(?Ie{m1mkQ8lmAU9(`{OHCPv9jddWWK*X0t+^E0SHjq!(6P*o z-Sy=PU$)m5-?=z3HJm72w`kEhYk{O~vu|13O3E`T*c@9KdRAmGHY7R><-~YiSwJ+Tr#}v`|n^tS=(Omri15?>+xH73Kh92J=ZNzjai+ewz}k9 zoV`tj&NL4X$x4QXjrlviOn8|wt7vbosomaug{}O&RntdBXyHSdaHFFf{Vl%dXJ6TU<&E66uiIA7 zxN(WOr}#0eQCrc3_jkMYs7+_KpC875`@QC>M+rJS*TpKl7Vxaz5bF5wCI6F~-A~1? zEwXqbU9xnR$bsg}*}|O{k35->f5A0((WdQ7S48SAb}iH}v^24`)#`Ho(<@WVyP{lk z`SRj3%a+|++T*hK@^|;c%C*b>=4kQw2Jds6uEEzS%viqO_Nu_`uj_0lO7Ql7nJG27 z@#^j=ohKEKYo9%|wn2k$XZ716o}#W#Z9LBG>vjoEc7Eid@Vw^=$HJ*CrRQC>j=M>u zPETwRaI$>(z4GUwWb@@m*B+h!c`MJ>9}#E!yTX}-_EUbU72dJ$JABo^zL{_4Ge#$+&R)mS3bxp~uRUoNxE$OysY< z$jtC)?!pfd@%w!F_FP%ILh0RKE0Leqw2v+Axx>|z@w<5YYu(*{By{6d7%o&_vzPkz zW#`+sx$nM6T>7k_pK1SeXT`$3n;!?boe)V@mj2r}S^IJ7AKrzJzy3S1y|(k@!hLbo zWm~2+efk-@$l}VkSvM2szl@zccXf}F)&_UYQ*+M*tWf_g7{70kc7a22(f40^aT)Ue zZ$GVw*(CecD?Zfcn}8F?!biRTE%rUwdV1~=s|OZ-JEqQ&jM<@DAQP@&Q9rqSPJzyX ztauUE(j^neLfiSLvH)rHA(g~o&WS@Y zq^B_NPSu%P7jGIqzx8F__m}T&({10#g+;F~ol|fk+I7*yv|{7i2cr5STnsH2__?RI zf1P0(|GM!|_GQ7>9KCMBduIKSE1KzzF@q%r#9 z#+B}WjM+s+75cxa_-B3C#%&h(;bU_dXa4Sn#08s}B-qYbd`?q{-|(B^_!@`64V_KF zZ#Q&$ots^7f=N`g;Gv@ybKDB0g>%^F9tvaSP~389!@Hdospis5axpCePAk^v9zF5r z=$B{l^X&d|taapmEodq)vUGC%#t56Q_pB#GvdeTIWo%fv(oa_~$&g{ec8w?fCcfVL zJv&dP94~KDxNPoUE0W}-Bepz~*;m@<{C4l4cPB1Cz0o|7n_fbb(0$ABw723f+Q9J~HBFFgA{kt>EbJ>Tfu$7#y3In8Iwa;}*y zklcAH^k3!o6&q??!+$h9+otz(`aPF}A}Y($nDi~GITTw0PFa}0vv~NTV(;NC=b!AJ z5;;G%BDbr+yP*EXw{O*ll@qI1%RbTjr!F(?@U#mB9V-)e-S_^-@>}nx&u<^uxw3u2 zeT90PzdAhJD*2`Q>&vxVU#chP{wPwrTfU8-!70AQ=I^|k%Hln*6s`#`)OTw1XTEcO z&TCt7hAUdxp}Rx2C2#w1;*6ppngD7tXzZ(dr_%gS>zTh9FM{J!XU z((RLG>L;9Q#S=t#}KD_JhuQaT znBDq7z=!cpuljWPEes5E>I?GrT;^?GyCJhL`$16KS}p;n6)XvNi$9*qGi&*DO4o^F zVa^ZVIICyT-SG*Nl^#bfn)q|0xxJHiQe>Nkz){7Yp|NW{_U4;ymOS|6SI)or8?Oje zd7CnDYb_XfF-?x9q{T|6ny(J0@GG`l$O`+iSF65xdNhy8o6HZfpEg$C zcyv8Y;hHdukAzw?r+S_C4zB3@y3-boL3N9!v~#Wc@aErED``O>)?|mib10 zn|`x_;vskD4~tUMu3lICF|)bW?M8OPH8X~W^M4p7$QU;$I7V6yJ0@?B^9 zoROj8G^>_r$?mjiDH;Mk^SU4YmAkQY-c_ZAaoqb?H?D7MeEu+sqps`FN2lv6mhwl7 zDzpS-9+2v;)Lie#{o%p0M^(3@0|UjS`qFg1^R{i7B{u2G#L!()shdCdsGG>FU9m#= zXiEK@!antryJ{{z%JcDv_Wzh%po?Rs3wf1bN>b>i{PnSK9s z+jsT!uKC8fRm1BO_q*qPOE!G5IpaA;;I{uR=Xm$~mdU>HdK^g=J{hhj@g=gF4W%;7((ZdBdKx{*EO`mG!h*ROl-3;)tesW_()e(AXSqeHQc zcMor>jyUewZZg$!QD5TvgH>0g_Q{piKJYs081N)Y(sNP{v-BP*o;coD-_QPWIXAQ9 z9K)elMus3?;TOGIzRaF7p*~6bVAYjZyPtI5?X`TvcjD0JJ)e6n7af@-^G)G=iht`Q zh6PXLK7W#MWnJFwWVz=8PcXxJs|RNMzk7{O=W{YJG}qm5Ik@etv3Joe59XO>6Ry6U z&A{;KO_T}mYdM{h0SY(X&UO%(kX^TK=0mP~Wrw=ki`q5iZ>(ZaZ1G~dW_#Ydk~b>A zEizW`UGcwHS*_3StP#9w^Y-IIN)v2wan-zZLGg+Z#|eUXnE^`hXlhR<&*sfS0{JxQ07paa$TtROuSO5XQ%l}miwye_09LUEnfNBXaC<8%c(9OK5zW@`5>=!$;$8_)_U=~ zSeHCs=&*se|Am&;>uql{9$EbRT@e2^d2=4SisvTT*UL2KZoaI1{=@{i+_jT7%9~%a zO}(5I^+LDgaNg9uv$Mn81VuNyLwiZf|NrdPd(OCY`=xJ>kEtbR|IRFbK655t*^w%y zWeKdQKi6Z+ln#Y@zP6JRcU{ zTly{b(@ZJfx65xcE~v^jjrDC`*ZL&+-ZX#l`t{r5{qOze-^e((_2rl9 zuLrXaZk%XX_Weu%SL@_+;tlsam>u5a74^65X4*JU;qt2)FV}AQnyP)gaAg_8rXwkb zicTyF(Xvgq{q%k{28>t|KZW3wl3{CaNg z`AOe-zBk^=*&uh#I=$S3i`Tt$&D(o>6}yxe66QRX5102)DT?QO!mYDEu{^tFhQQBj z+*1$S7s$HGE;QMBqQ>_fyPm$U-#z2w38VCu0{IvJ4I=oY=Ppm5#~}61QfQLMu4|8f zt6VAC;yp)#iQ#Zudx8170D*Old+Lr#7J8(Q0)MJ0p`%36w_NS%B=Qs7bD9ix6anTiP6*$=T zE?mByonhDg*U$1lOw3nKig}X%Icus_f$D|7dF2@vQ#@2=&C54>XB@>BwLqw1Ub+Mu z!y)Cw@9lZ5PKlN|fvc}bW{SqmKJ>X}^G-_}F*b%W{?peszg>Ro_|A{a&zL9XD|fDx z@#Nmla=5r{-#@#pUUT*Hrzwl=npIY2Asn>m=&eOnAx|rgD&7%NvUlC$pTXJmqHejh zRPQgg+Ls$Y+Tu3FNhN#_()(ZkA8v@q1u0KBMKkM!*A7Vw~vYV@T|EL{w;pvNFWXOHw1Iu`QdXWea?kzjQTScUgeYD@vz2z&sV-Zk37_7am6Uy5agcox?SDm z!hu5zG4=)r+?NKJYH= z=zFh;8tmT{|M+fsEBg6{xy+sR6Qz9$&t?dVD{k=-yC!b`H9GiL?Jq$mj-^Y~{2f7k zDXv58Nvh6kgLYTn{r0%*yu0PH-t!UOm$&?M-Tb)aaPhh1TFaZP9m$t85>ki?z^||gukHf>eTNW&Y4f1e5%^+(~ao2@8ZhOxiPn1etG4m{2DZhHUss$ew6VO|_+NPcL(AsAtDJ@hzpm3( zHfu{fqd!a6U1yrJ*ip6Ctm&(s?vJ{}yyUrVyikVVp7(7pGc!(9waLgdHMc*QBR#KL z%B|-PH@wcyNL7gt58UoSgP`eiEDq<>lKS3Y3(p-R2UJf1@k@=Ol-{%R^!P zIWJil0yNUhrYwJ3vGfhQ7K6-c1yviNwbiH8{8NI0gWuL1zLj$>cD3M6@F-*b-|P;R z=j-Gop8xnCTJ7+aJ@rXdeAdEk`%>Rz=l#0B_~$GIRmkYx;<9}wZFwvgGVRpb5L)(a zn(l3mvuk~#B_AJN&#E!qY4ZEUr<7Ln>tFZZrqJ=qUhcv*2jx9FYBjo5&2ZBtrs}|AM5;zr=PT&jUF^QXPk{{tFMxAiEj=sExzaN z-uU)^rTHDX0ox<2gjmyWYINOsUoY!Y|KNvo)1IE^tuM-B9=_c%|EF5=>ODJ))Qx{# zms>O2J>#tA;(y71J6-E}T4}ZS;o^Jp-AB!HE=)|Bd-m4Rzct1-LaYo&-Iy3! zB5agxHtJdT?XmAJX3MMd%&!S6exRD}uj9{PA#Kch6Z&s13VYc^= zUT%~#eip6Gk@WU|@q)Len;*LvgT_%^7RNm3(iUx4qx7ZPiz0NA~jPeS6<&&c5@~K0U$m=y|)^#d(vozAkIwe$DSV~PUmN0{4pImNrKUM+g|clxn3jR_NEPM)b|V37DdYqMI@f7Q1%guA&+2m##m8qzyZqh0jdgVUzRaWbNuZX?bYLovR3^<%O z^^fxH3k!CJO@7N>hmQfa>Ttm5k1y85tU zAuq?DfArcG#=ftT{g!uHaqk|RACVb0k5pH86!x(*eCGc3?fTuK)lBEz56&xpyE2Sb zEjhbP$T|Lt&A;PfAJ0vQsh{tqm!41=`abf1#tq>;LYw~XwB8-sSfp+&^6KQgTMrI+ z$8vS;`2Ko=is##0#T_P|*dCHR_A+7s?!u?w8EYTD9BCwzfW#z2O~y%`e+qH6O2Q&9r0=p1oq<=5K1r z>>KAXF#Ky1kn4W+J*(qu%7;@kiqcE>sj)IJOug`V-`@k?vOc`Ib&XS1UeukJ{$*q( z^={(z=ILku!`1?9_FuJBGxNvlj05kP7~W1^b&vlqum9?T8w*2IJKdh?*B$=Jrg2H? zw-soP!AkcttJ%4R1_7tloZCd5ITi*P?QLuSt?RqGfUU(+@>|y0|G8!}Z%6ZO-FLB1OKFY1^zZZR#)~dp(|(#c^=4J6jh^aq z8-^E!w=Zj}^z`0}(2LT}{{xAQ^9)QkF(lkN&$j+q z=GtZft%ThEY5N_X8nqs|WxeBX`rl_;E*3I0++C}5P21*qGed%H+MXA0zr;)4-uC$B z+1b2rm*2U%g^7V_{;nUQ)pxI-UJYx* znHc=)H$0h^k@BzRqt3+>e~#vNfJSoXT#K6>+X61@!j`w%)@$z$kBqcU77du zz4E*5yKQO4vt@78-MRDk9>bN8<61aqd zjT>8M2y`FKyv4w9NyLM7u_MRRt!ma=?bj4ZZb|5sz4PT`&Ll0zIUGyuOlRMGbN}6~ z<1;>Z^qu;5MStI$M-Iyq*PEq3h*F*Gapslhv%MGCF0e72DYLSadmv7Dn2JKTb<$iHF{z?6XSwG#Ky;FN@la*TnEH$TBUbwdH$dW5x z`@-c;8_%}6z08LFg;Dw%7o!a&pL~0x&V=1$-PFbXN>O*soafU2SLytGYU6sm{z-fL zVpg>PH_)h`-Rkr;Oo1|!;;&xqy7GIDFBijsvMsm&I642xyHjkIuU`WhuiEh^P=F=L zcA_1VV^Ywn%iA*kFW{=ZcsaPBiGg9mo*M=q3NFeCm9Srie>b%cUze zLXVK9D32ZkPf@ZeDsV6sDovOn6IIYA81?#E-12Wn1I3<(iOtmUTp3^UGxf&o?aSn+ zE^>WyxgQkyTYd6AZLQMh6q-CK-(b$ZBjys9vZ6eK+{0dGO+9>cr0@Yd%0!Sv;$Xn zb|;<72uxHBYT%#DYvbx2_BPq)$Lx;Zwg0`+Srl6YwCqFmp2?)A|ltBrnBbm$tzbv%J;l`SgBZG`o`j7 ztcBvPC`N`x{lg2hFZNB|{4V^i{4b%-l!Vt0BX=4hMtYuT=e7g{Zg^Ljxa@SI8H>#h z@H{MsuEWYcrOh3oVRz2gOx|c}dUwfk`-%g15-nHk|DOHe-ulLU|H_`0EnCs?PW(?q z4BHgznHTqe(^;^3OSyu}8fC7YAEx@3zq<$PKb~)L$~`+||9toA)+=!-Q*!OT*U8SB zC-?WM{Pe9~SEbL-o|>J@E#f-y;-VU{oebiS&&=1iarKV8AAc+MePyLx`FcxGj(xiM zS(NApa~Aj6zdtohRynw3zHLds{Vz4u`^2v8^PYQYiHGf?+uI&Dq)or{b((1{mH~mS zPkna?u_!)xnXj$J*|zZQ+O)gIeA^D1r9Vh2u>V}@f758ai1xwqlPB*#*#0)-mDS~Z z`$WAt0(+-!lQ%b$jK1x^+xq;Oo-p?{>Iq!i-WufGzP9A%(vp3K+Tkgpf?Qu+))!05 zT@0MfqwBt_`;4)ZhWVQ6IEkIFgF3}yUp^O5Y!RpnpRR0^#j!SN>8&LU40H0&8P+ve zC_*MoZ{}s$zg)Ls#pL<7TaH_7T{Ux2Nlvrx905j$?>)Q>E6!T2UB>#Z`Els>zdLRg z9q|YgRPoF(^}1Xq#=zoeVrr$~<(_L4(O-6&fA^Dfr|vZhY`%Nt-pi9eW*A#C2;`}L zb_;u{WDIW1iyIr?tB(VvYds?@8)2>J6qu#XVSYa$<_h zjL#iQ&dl6fa#Ve8ZA_ZdNv%asEkA$GowR;V@COmygTYhQDEa)3{LXF>bMVul?4lL{ zt@_m)LK_uWxYnd@yZp#y!MBYm%6aAMYyY_GdkWpEy87jdhU?j^J)W1ROPru)KawB#y8}g3d4b~+e{}) zaPfX$;%<>%cPaVY^rT~-Jg!*R)|=Q|O22jf+}zdWZ#$1#bVgMp@~+Z7DTpX38+2P0KD#UvNUC`us2V!}IL6 z@7;Trm!Z=$^NqCM-v#T-8hP*T-PbLC>-hgNOS$Pe?zmIkDkx1pDL{G;Bw#HkzTjY_tVtPJpO?iSA# zb>U6y!RgB$W454zv#alvZR$GlZ-(*CkMciX@SD#~Uvou`ORMpo*Yi8Ahcv&<&0VbF zv@+#UA?G{h`d|izqi$K}c=h8l!ruoO-Ol`7xcUEP!yWuwtd0UL&ua`OPB1dMT(rdd zcgv}&GZyJDQ=cqn$giJWHGNWUz;o`E3q%+cJUeHq{w&tGd`(-jjg4VjUDy`Mou~AE zTApWTP*}~e&2j3+fE}uA_VU@)XO+Z@Ua@G${IE=wpExCH)AUUZOE#y9U)(hJr=|JH z@N=3KT}~_KEh;gs{hYR@;0&lNKeZumsd0mVlj;H)d5@E&=ToP@6$*T`G(6?oCGGc{ znf2FX?RT(IjgH|^+;Yb2k2{NEOPK9XrmZ3S+cmw^_jev&dgZrVdGzMWYcH7ooV8#u zFuf`{o7+%Pto!m7MusJt6E>y23CU4maOgPtRO`SN-ed-ce9vuW3o@gA`Fi=NZCB?o zvMqR(eC|oo#ygd#Ph~9>5#=(v?k2<#SaJBuVy`M;*5C;Ni+-F7kf6vx9`E_qdc=&uusf*aOy{#&9Rl@~!FVCD`Jh|qn&f(xK z4O8u1mv^1j0;QUu4WW!q8M)eT*@KEbO0)DY|5?ArRe!JR`lIuW4;`|MU-S3SW^T|@ zEsm*ulk%^tLKa$y%vfxE)8awioLer8XReeQnu6xv=6!#9JK*n%poI#1(9k`lh)5+^uM@s%@0kjBP>tP&H9-pt=J+E^|*kIrR9Q@n*9W=x9LH}8h=0j3BNE$ z`SWtGe8%;2o^U+>swLz3(Bkx**SYzwuCW;wvo_vAZ%$n(*s^GmpUC9?sNASe{mAGSgmv73t@w&sMveI(% z-6xi>r{8aP-|^+{ms+8u?>CrKb<9Eu!XMudzQ;9(Z~bn(UwKRUj*x30S8VsL``?Yxn_s7-dTgW5 zJ(=+qG>Pz7RQx=5r>ADo+}Tqb*`G~SigY!xS;0-p8sbF**&H7me|h3#=3s9 zAE_>UVp5#U4izdt4J%50_J;?jqzO1J%?_=%S8fUDjPflnU|=ZtIcf54!P|S*uKYXY z_ODHW8v_{`Fxpm(4T%}mt0TYnH0N$$Z1_6kr-=X_obWXn{An26n>eD;X~}J zDQd2-1n+K>WjEP9W!?5Qt;Q4dEiJW{wXIv5duz|xC-OY0DGI4^nz!N&zkg@v&i6oT z)g`hrcuvYWzDv{V`I|2>dnW7&;IFg0R&Tc>v03jcSN-v)x92i_dK=Y-Wo{~HQ}GNr zEbULwgw#oK*o4%Volh7Uw9uNHe*Q|kKfGMKf zzXu)8?bSAV$#h(GamOdu=o?Ju{@j`UL_gieHQ4Keh^YFJ2U9nE-G8&Ni}aofFJ3c${iG!VHpa9#0EueONGizt4E3tJL3t}ruH zCdXMD?VBU0Wu5x>=^nF(iq0$6OntWh!(rQbLM(v`6+9<-_;~65f7(*I;%DvFw$#f1-gq-H>Q&)C!Kekl6AY}*=)ahKHm7fE#o}E{ygpywb0=}7 zQp+^KzEA`EPYNeHTTIF?Y?@^F8Mfb*p9f zPWLeP)t%obPguOQa%pj6K;Gm3Pd=MzI)FOpjyF~@FeumvtzEHV^@=sCSFB0iHhT~A zLf6i)d8UzjSF6@8+_rCN!Qa}XpijJQPrpal_Fq^Od1DH@w~0~x#E&{_#O$qCg$6v` zpYw!C=b+Y~t5-KT2pstkaplhOy+H&f7Qh0EGaD_^G-@42LNhpXe!1Pj3raT(rx_qXl}ZFtc_)q-Xm#ozJl_$kttp2j|cF~0Hbu6a~L}eq-SJvx@-QVD-UOz>J zqu*ugS1rhB{+z@YUp~0>t)9APe@`)JJpa8sk8H)s%Ab>rYj@@^2wt08xaU#X-no{% z>EF~ot=azQZe(Py?~z2=04^?u8@9I|Y&B#^kVYQOzvU;VrDn{b*dlgc>zAr)##)W; z|2MmKO+Cj5PAX0uy6vGBVU3^9Iw^BXf3wnQ-xVZ(b$67_--B1&H+5Zjf6+tez!VjZ zMJq2l20~VuSXUotI52fX)Kwk!3Ca`O#Xj)0%y_F->5!Zx`{IA_^AVPY^bS#fONv!?6E zOulL{WUL7P&E|YjzT#VEso_k}1foFH>r;z74<2fpuD$#Et((C$q7`f3{AZol@+0aT zxXUi}x1wg&WI%59T`cyu9;K!0qg`_Py3yA!F;M^R}IkKdb*DSX5(XTH3G?r5{&#W1^7Fa*`KJTb7lQj%PrUj{*yCOWg$RDHlkKW` zE&A9vSMAxIk38?p_zxM9`{bb40S9edD z&TbVQ|Mu)WZq4G!UN0)|-}~#gf4Th(506C}Tjzgj+1In|m}SEJ5bxkiAHoB_d73h0 z%n#wM7rkn;@{C-)MtqupQ|f|0`zM3SgsHBRo3=97zZZD&a_z<((@hmZN}yq)sST#r zR~`7GvpT|`r$&Z_;d^`CX~*POKmWD4&s&?Ed+NBveO2*#XNli!+1aL(RRTm3Yj57D zx7+-B$+kGn{^~Q=RzEJ(yjs5hc&_^Dv{yXnqvn;Lx~Mg5o)&gVVauIsA-9?KysoQQ zDZFgSl!R%|7XM#!e^322k+wH^q8sBLTFSF9yf%F7n!o)2sTh0O?|0=_xNJ|{%=pfG-S$2)k3};MEOWay=h`{_qZ|BhKi?+*qu$!-`l42I!?)@B z@m0r*&+Sia&ih<1vFQ5Fiv|5rOQ&3)6xsqEHlG9>%;3yUHTs%t@mcV>=ucp0wjo^tuJ@oF9So@vT%KWq2-rnJ>Y9p1NRvD%X7jrY8ks|PB8id_Mx z?5LY@PuJBwt>JGHbN^+zLCHVlgNh5No{kD!y*#v0gYRU1#w`VoMkYmF_OG#X|MFFD zf99#WdG0yMwtGRm3{Ez;WpRJf!(W!bZd0`<`+B$q32boF+9**JHm)UGsd)APT@=J>Zv zyC9VrJt6Dd{;uzZl2Z~4AAJ^K@c8}JonztD#{0*fvi6HREnRbE-F88zn?d`RXn%EK ztv@9Qsx`vS&6>@~$RN>n?f>#+|7$K(U5QZWdFB~8e0ipq0;L?+Cba!7gR zVGFcA&72o{a|B{>ZP1C4l#XP`uz%{Q!oYCMa^DFX#zoYnmzz%{EPxx467{CbQ1+&#|wz$i7`9ck!Ur zp*{0U_on*BN3TwKbG*0I|K^nai`V|o&AYMo(#CE3Hox8ZcvZ`s!|G3bnxI_`=g%#d zzHZxE02?V@25KB^-t=VmlN`%OceX9|{M>S>?$DhtHSUcqFQCo$Rlk}yeePL$at4nN zv~S_D-}9OHmviQ6PrKGAIW3gCeeoS{{|k<$fOltX>r9=r^L1_Z9uoW8z32*?u15Fa zsKD))EJ2Mo0VmZpU-UBqy&~^4EKr?V%eO>IOy_oI<8wt&tX=S0F+=aT_6ATxf39^z zU0W^RRIisdxshvR6kEK)U1jfOojV}?{%BB;YGlyNNY+yuZB84W=UA)u!#=|8LxN&R z)`$I@WF7`aKlXaUqA@W?q2(F(|4MQ3Y3fcHl53Aj3LLYv`|)$e*MfU5`30OZt{z&* zB<}4wHN`WPZEeR>`En6ZQSsv8!{QG{t>y~ZF`aW5R44I*%HoBl$-RA{4FXZl1#6me zetgK=IOR$XM@58q;7_qM&$*L1*2+Hpy>z45!;elYTprjb?>wx$5`>7IJq00c+0uL^WdunbA{|kLwEbDFC@fQN0j;GZodhDpa`-k_Q^@G@# zdlXu(@yIMn_>eDT6T$-y6EiiStb3z*goU$eERqL-4(mXG8(k(LDG&REN zZLEM+Zl{ZqiHuh*56bo-?n_bjDJ^p*e%n87Z)N7IjMo8LQ_qyO{qFo+`zZS58-7AOR zPtK>mh~l`$c>4g8L$rJJ|JFK3fob~5+T8W3f>DAumL!xOULO|HqnaDtpbklyLWjdx zD|PEr>s?c0KZOQ{2TrVs{~htU=-H94+qN%Sq-P>?HsYN$Po}A^%1Y(cC0kFWJ(uKX zU;(!xMW>ctQEUF1QQny0eE8xMxzH;UL#@^>Q!Ox!QK$j+QpC6dxKdj$ylUJ#Q#`zL zO1kC~M&0QZ>Q-9TE_^zHHJWpc99+Nl`Yb8m zcX8#fdU{=y&pu1r*0@z>W5*&623_|khKAa_z_d|jNif~76-Nmcpvgbj~i zYXSbL-7i|f`tCf}Ov$TO3=MN;FaJL|&F7cGbk5rcs`M+KI`Z9M3!677;T(fycgQ`h z0@H*W=>_wPqx&PD9-3~t|B4R#=ejqh?~G4zdrrFY{$jQLu}T2}CvUddB5PPHn47w` zl;m>5Y924p%*gNB|BH?+hIL(7^X&h(zq$O~{pt0973>V}{#u#T)|dQoe}DK{irt;( zf39BTI=?egc|p~$X7)3()0%%(?`M1WSL(&<{P4W=Bb*yw{tWy5@!8AzUbjQFzxK|u zRNnvn^@T5AUg-bdv1V=4wBQHA{DpXdhqu9Bdyj?I;}Pf7TKQJ z^K50@mEsehKjfX;cb$RZb;DzehhdwvHy3z6u*h5Z(=|17j&%8)f|5P=5^tq{iajNx zYyUi|{jTD%qX(8Zf_8A+U}88@b?E9_uKpHXcHO)0pXE+|wfl+jTjSCa&^Cf&JI`EW zZoR%NyMC{&qH5bdiCq>2fj!-yoB~B;k@uOrW^35Dxt2lTm(r7$-w_)|Jo>t?ewi>c zFf^Rm;o;fMKiB{GZBzSJ{q}DA7kqKNaew~nZJVF-ea>eQNrm`{eZ4)g`$}$BUCGKa zVO`HE+{wbwQ~dal?!gc9+m56t{Ynnm89b9~eT|Q$nNgTeo1jxh-IHwooS+7QQyW}z zxj*PhEWFhIe>sO@$TrY4#`D?pn6jVldvh|*i~ru~{3r9igF8>`4DZtSz0-_VQk48= zb<2NOu;Gf(v-|v=7zE@VUs;vbb!j87S)r4U>kC;9!`r@Z=gKh@%=;EFn!K7~*Qzy@?vAgCIXm$Pey#rUD{0@okdJ`k6(a5tfJFrOh;`RH_ z@vnDc=O6#S?%!T7JL6#4WyZham>r(9cdWd)WbO53%c9h; z2}<>RiZa%bl_#pqo(e+a~n+(j1(rRydO;YikbnIBl{y!JO6(=b?Rb=^6{l)V2Kijip^_l&wt$HZJH(|ZU?YL}Z zPa%dI>XBKtqJL~S82uYMRK`6KpQbqt2cxmZ2CIyYk!+aFvB32Xax zu>&kJS#x>3-fVb^d3{R>vpm zdUfV`IVr|Wt3yw<-PM|VPi%+L>%g35Y-(uSM((N35M6Zrqnt zmeqNRYvERo{QctLnrGTJJd$+aS4`J`a-qPZ&UF8cH8)mVcz-!P$29$V`j77>KK{+W z3V#My-OsM<{5@y)XP@Oy7aYB7T^zXN{%ZgH&;|FcC$D=P%D!XEE=0 zK6(0f{dQp%LB3Xf{usSG!7@|V97#F!wNbmqHpe!{^o^;={xG{oU&O3x70-V@XY6-c z(EHPl^QJqdCn9!+oXTqms#q%^%+RoInejCAT_oAh)_84@+xkoIXHt1G-)`mjZ=c*k z?>sY_q>z4Z{p`y5T5}FDeiD6oCT!}0`^&%c{}P_u`QU28=YNsGGnYKkV{Z|tlCW?& zc&nvcK7�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

t{UEmUV}QDz!B|tMER+ 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 literal 0 HcmV?d00001 diff --git a/Common/Interfaces/AntennaInterface/src/Antenna.xmi b/Common/Interfaces/AntennaInterface/src/Antenna.xmi new file mode 100644 index 000000000..6ad8e945d --- /dev/null +++ b/Common/Interfaces/AntennaInterface/src/Antenna.xmi @@ -0,0 +1,10409 @@ + + + + + umbrello uml modeller http://uml.sf.net + 1.2.90 + UnicodeUTF8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +