From efa8632b354806a33ee9297c114cc85a2e6052a8 Mon Sep 17 00:00:00 2001
From: Claudio Scafuri <claudio.scafuri@elettra.eu>
Date: Wed, 14 Jul 2021 09:20:04 +0200
Subject: [PATCH] imported from CVS release_15

---
 .gitignore                             |   7 +
 FRTND_E/FRTND_E.py                     |  25 +
 FRTND_E/Makefile                       |   4 +
 FRTND_E/active_frntd_e.py              | 245 ++++++++++
 FRTND_E/frntd_e.ui                     | 163 +++++++
 FRTND_E/ui_frntd_e.py                  | 105 ++++
 TCPSserver/README                      |  20 +
 TCPSserver/TCPS2tango.coverage         | Bin 0 -> 81963 bytes
 TCPSserver/TCPS2tango.py               | 390 +++++++++++++++
 TCPSserver/TCPSserver.e4p              | 260 ++++++++++
 TCPSserver/TCPStwserver.py             | 152 ++++++
 TCPSserver/TODO                        |   2 +
 TCPSserver/elettrabcsbridge.cfg        | 329 +++++++++++++
 TCPSserver/elettrabcsbridge011.cfg     |  49 ++
 TCPSserver/elettrabcsbridge011.cfg.old |  48 ++
 TCPSserver/elettrabcsbridge012.cfg     |  55 +++
 TCPSserver/elettrabcsbridge022.cfg     |  45 ++
 TCPSserver/elettrabcsbridge032.cfg     |  45 ++
 TCPSserver/elettrabcsbridge042.cfg     |  50 ++
 TCPSserver/elettrabcsbridge052.cfg     |  40 ++
 TCPSserver/elettrabcsbridge061.cfg     |  31 ++
 TCPSserver/elettrabcsbridge062.cfg     |  41 ++
 TCPSserver/elettrabcsbridge071.cfg     |  30 ++
 TCPSserver/elettrabcsbridge072.cfg     |  39 ++
 TCPSserver/elettrabcsbridge081.cfg     |  33 ++
 TCPSserver/elettrabcsbridge082.cfg     |  53 +++
 TCPSserver/elettrabcsbridge091.cfg     |  30 ++
 TCPSserver/elettrabcsbridge092.cfg     |  53 +++
 TCPSserver/elettrabcsbridge101.cfg     |  32 ++
 TCPSserver/elettrabcsbridge102.cfg     |  48 ++
 TCPSserver/elettrabcsbridge111.cfg     |  29 ++
 TCPSserver/elettrabcsbridge112.cfg     |  36 ++
 TCPSserver/list-active.txt             |  36 ++
 TCPSserver/prova.sh                    |   9 +
 TCPSserver/tcps.sh                     | 156 ++++++
 TCPSserver/tcps.sh.inst                | 156 ++++++
 TCPSserver/tcpserver20012.log          |   0
 TCPSserver/testcmd.cfg                 |  13 +
 TCPSserver/testexc.py                  |  19 +
 TCPSserver/testphbsh.cfg               |  19 +
 TCPSserver/testsissi.cfg               |  30 ++
 blfe.py                                | 209 ++++++++
 blfetest.py                            |  11 +
 demo.py                                |  33 ++
 fakedevices/HelicalID.py               | 632 +++++++++++++++++++++++++
 fakedevices/KymaID.py                  | 323 +++++++++++++
 fakedevices/TangoClassID.txt           |  11 +
 lib_pyElettra.py                       | 143 ++++++
 punti_da_comandare.cfg.txt             |  84 ++++
 punti_di_lettura.cfg.txt               |  92 ++++
 tabella-bemline-id.ods                 | Bin 0 -> 27832 bytes
 testsissi.py                           |  19 +
 52 files changed, 4484 insertions(+)
 create mode 100644 .gitignore
 create mode 100755 FRTND_E/FRTND_E.py
 create mode 100644 FRTND_E/Makefile
 create mode 100644 FRTND_E/active_frntd_e.py
 create mode 100644 FRTND_E/frntd_e.ui
 create mode 100644 FRTND_E/ui_frntd_e.py
 create mode 100644 TCPSserver/README
 create mode 100644 TCPSserver/TCPS2tango.coverage
 create mode 100644 TCPSserver/TCPS2tango.py
 create mode 100644 TCPSserver/TCPSserver.e4p
 create mode 100755 TCPSserver/TCPStwserver.py
 create mode 100644 TCPSserver/TODO
 create mode 100644 TCPSserver/elettrabcsbridge.cfg
 create mode 100644 TCPSserver/elettrabcsbridge011.cfg
 create mode 100644 TCPSserver/elettrabcsbridge011.cfg.old
 create mode 100644 TCPSserver/elettrabcsbridge012.cfg
 create mode 100644 TCPSserver/elettrabcsbridge022.cfg
 create mode 100644 TCPSserver/elettrabcsbridge032.cfg
 create mode 100644 TCPSserver/elettrabcsbridge042.cfg
 create mode 100644 TCPSserver/elettrabcsbridge052.cfg
 create mode 100644 TCPSserver/elettrabcsbridge061.cfg
 create mode 100644 TCPSserver/elettrabcsbridge062.cfg
 create mode 100644 TCPSserver/elettrabcsbridge071.cfg
 create mode 100644 TCPSserver/elettrabcsbridge072.cfg
 create mode 100644 TCPSserver/elettrabcsbridge081.cfg
 create mode 100644 TCPSserver/elettrabcsbridge082.cfg
 create mode 100644 TCPSserver/elettrabcsbridge091.cfg
 create mode 100644 TCPSserver/elettrabcsbridge092.cfg
 create mode 100644 TCPSserver/elettrabcsbridge101.cfg
 create mode 100644 TCPSserver/elettrabcsbridge102.cfg
 create mode 100644 TCPSserver/elettrabcsbridge111.cfg
 create mode 100644 TCPSserver/elettrabcsbridge112.cfg
 create mode 100644 TCPSserver/list-active.txt
 create mode 100755 TCPSserver/prova.sh
 create mode 100755 TCPSserver/tcps.sh
 create mode 100755 TCPSserver/tcps.sh.inst
 create mode 100644 TCPSserver/tcpserver20012.log
 create mode 100644 TCPSserver/testcmd.cfg
 create mode 100644 TCPSserver/testexc.py
 create mode 100644 TCPSserver/testphbsh.cfg
 create mode 100644 TCPSserver/testsissi.cfg
 create mode 100644 blfe.py
 create mode 100644 blfetest.py
 create mode 100755 demo.py
 create mode 100644 fakedevices/HelicalID.py
 create mode 100755 fakedevices/KymaID.py
 create mode 100644 fakedevices/TangoClassID.txt
 create mode 100644 lib_pyElettra.py
 create mode 100644 punti_da_comandare.cfg.txt
 create mode 100644 punti_di_lettura.cfg.txt
 create mode 100644 tabella-bemline-id.ods
 create mode 100644 testsissi.py

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..43687c1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+CVS
+*.pyc
+core
+.project
+.pydevproject
+.idea
+
diff --git a/FRTND_E/FRTND_E.py b/FRTND_E/FRTND_E.py
new file mode 100755
index 0000000..237b843
--- /dev/null
+++ b/FRTND_E/FRTND_E.py
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+
+# $Author: claudio $
+#
+# $Name:  $
+#
+# $Log: FRTND_E.py,v $
+# Revision 1.3  2017-02-13 09:30:51  claudio
+# revision tag
+#
+#
+
+import sys
+from PyQt4 import QtCore, QtGui
+#from ui_frntd_e import Ui_frntd_e
+from active_frntd_e import active_frntd_e
+app = QtGui.QApplication(sys.argv)
+window = QtGui.QDialog()
+#ui = Ui_frntd_e()
+ui=active_frntd_e()
+#ui.setupUi(window)
+ui.setup(window)
+
+window.show()
+sys.exit(app.exec_())
diff --git a/FRTND_E/Makefile b/FRTND_E/Makefile
new file mode 100644
index 0000000..c2aa3aa
--- /dev/null
+++ b/FRTND_E/Makefile
@@ -0,0 +1,4 @@
+#makefile for PyQt4 panel
+
+ui_frntd_e.py::frntd_e.ui
+	pyuic4 frntd_e.ui >ui_frntd_e.py
\ No newline at end of file
diff --git a/FRTND_E/active_frntd_e.py b/FRTND_E/active_frntd_e.py
new file mode 100644
index 0000000..9e260e6
--- /dev/null
+++ b/FRTND_E/active_frntd_e.py
@@ -0,0 +1,245 @@
+# deirved class to which active beahvoirou is delegated
+# the fatehr class is re-generated by the designer
+
+# $Author: claudio $
+#
+# $Name:  $
+#
+# $Log: active_frntd_e.py,v $
+# Revision 1.5  2019-06-20 08:14:21  claudio
+# #8957, #8947: add new stopper syrmep, tango controlled
+#
+# Revision 1.4  2017-02-13 09:30:51  claudio
+# revision tag
+#
+#
+
+
+from PyQt4 import QtCore, QtGui
+from ui_frntd_e import *
+import blfe
+import tango
+
+
+class Worker(QtCore.QThread):
+    def __init__(self, parent=None):
+        QtCore.QThread.__init__(self, parent)
+        self.BL = blfe.blfe()
+        self.exiting = False
+        self.mode = 'update'
+        # tango device for syrmep - geco device
+        self.syrmepstopper = 0
+        self.syrmepstopperindex = 0
+        self.stopper_value = -1  # 0: closed , 1:open, -1 : unknown
+        try:
+            self.syrmepstopper = tango.DeviceProxy('syrmep-control-01.blcs.elettra.trieste.it:20000/syrmep/beamline/geco')
+        except:
+            self.syrmepstopper = 0
+
+    def run(self):
+        if self.mode == 'update':
+            self.update()
+        if self.mode == 'execute':
+            self.execute()
+
+    def update(self):
+        self.BL.read()
+        self.emit(QtCore.SIGNAL("UpdateThread(PyQt_PyObject)"), self.BL)
+        # read tango status
+        try:
+            self.stopper_value = self.syrmepstopper.r_bs4_v
+        except:
+            self.stopper_value = -1
+
+    def execute(self):
+        errtable = self.BL.closeall()
+
+        #close tango controlloed syrme stopper
+        try:
+            self.syrmepstopper.r_bs4_v=0
+        except:
+            self.emit(QtCore.SIGNAL("ExecuteError(PyQt_PyObject,PyQt_PyObject)"), self.BL, 'geco/r_bs4_v failed')
+        if errtable is None:
+            self.emit(QtCore.SIGNAL("ExecuteThread(PyQt_PyObject)"), self.BL)
+        else:
+            self.emit(QtCore.SIGNAL("ExecuteError(PyQt_PyObject,PyQt_PyObject)"), self.BL, errtable)
+
+
+class active_frntd_e(Ui_frntd_e, QtCore.QObject):
+
+    # ovverride setupUI: create graphics and active object, worker thread , then connects signals and start timer
+    def setup(self, father):
+        # create ancesstor graphic objetcs
+        ui = self.setupUi(father)
+        self.ui = ui
+        self.msgbox = None
+        # connect to slots of this class
+        self.connect(self.pushClose, QtCore.SIGNAL("clicked()"), self.slot_do_close)
+        self.connect(self.tableWidget, QtCore.SIGNAL("destroyed()"), self.slot_quit)
+
+        # create worker thread - does all the slow network activities
+        self.thread = Worker()
+
+        self.connect(self.thread, QtCore.SIGNAL("UpdateThread(PyQt_PyObject)"), self.slot_thread_update)
+        self.connect(self.thread, QtCore.SIGNAL("ExecuteThread(PyQt_PyObject)"), self.slot_thread_execute)
+        self.connect(self.thread, QtCore.SIGNAL("ExecuteError(PyQt_PyObject,PyQt_PyObject)"), self.slot_thread_execute_error)
+        self.connect(self.thread, QtCore.SIGNAL("ExecuteError(PyQt_PyObject,PyQt_PyObject)"), self.slot_thread_tango_error)
+
+        # get reference of BL object from thread
+        # since the class only reads form BL object non synch primitives are used
+        # N.B. python copyes object references
+        self.BL = self.thread.BL
+
+        # configure table widget and create color brushes
+        self.yellowbrush = QtGui.QBrush(QtGui.QColor("yellow"))
+        self.greenbrush = QtGui.QBrush(QtGui.QColor("green"))
+        self.redbrush = QtGui.QBrush(QtGui.QColor("red"))
+        self.graybrush = QtGui.QBrush(QtGui.QColor("gray"))
+        n = self.BL.nentries
+        self.tableWidget.setRowCount(n + 1)
+        row = 0
+        for entry in self.BL.bltable:
+            bname = entry[2]
+            objname = entry[0]
+            stname = entry[4]
+            col0 = QtGui.QTableWidgetItem(bname, 0)
+            col1 = QtGui.QTableWidgetItem(objname, 1)
+            col2 = QtGui.QTableWidgetItem(stname, 2)
+            col2.setBackground(self.graybrush)
+            self.tableWidget.setItem(row, 0, col0)
+            self.tableWidget.setItem(row, 1, col1)
+            self.tableWidget.setItem(row, 2, col2)
+            self.tableWidget.setRowHeight(row, 22)
+            row = row + 1
+        # add Tango managed entries - different
+        bname = 'Syrmep'
+        objname = 'geco/r_bs4_v'
+        stname = 'UNKNOWN'
+        col0 = QtGui.QTableWidgetItem(bname, 0)
+        col1 = QtGui.QTableWidgetItem(objname, 1)
+        col2 = QtGui.QTableWidgetItem(stname, 2)
+        col2.setBackground(self.graybrush)
+        self.tableWidget.setItem(row, 0, col0)
+        self.tableWidget.setItem(row, 1, col1)
+        self.tableWidget.setItem(row, 2, col2)
+        self.tableWidget.setRowHeight(row, 22)
+        self.thread.syrmepstopperindex = row
+        self.syrmepstopperindex = row
+        row = row + 1
+        palette = self.label.palette()
+        palette.setBrush(QtGui.QPalette.Window, self.graybrush)
+        self.label.setPalette(palette)
+        self.label.setAutoFillBackground(1)
+        self.label.setText('UNKNOWN')
+
+        # resize columns
+        self.tableWidget.setColumnWidth(0, 130)
+        self.tableWidget.setColumnWidth(1, 310)
+
+        # do first table update
+        self.update_table()
+        # start timer
+        self.timer = QtCore.QTimer(self)
+        self.connect(self.timer, QtCore.SIGNAL("timeout()"), self.update_table)
+        self.timer.start(3000)
+
+        return ui
+
+    def update_table(self):
+        # configure and start thread
+        self.thread.mode = 'update'
+        self.thread.start()
+
+    def redraw_table(self, myBL):
+        # redraw  informations
+        row = 0
+        for entry in myBL.bltable:
+            stname = entry[4]
+            item = self.tableWidget.item(row, 2)
+            item.setText(stname)
+            if stname == 'OPEN':
+                item.setBackground(self.redbrush)
+            if stname == 'CLOSED':
+                item.setBackground(self.greenbrush)
+            if stname == 'ERROR':
+                item.setBackground(self.yellowbrush)
+            if stname == 'UNKNOWN':
+                item.setBackground(self.graybrush)
+            # self.tableWidget.setItem(row,2,item)
+            row = row + 1
+        # check syrmep tango reading
+        idx = self.thread.syrmepstopperindex
+        item = self.tableWidget.item(idx, 2)
+        if self.thread.stopper_value == 1:
+            item.setBackground(self.redbrush)
+            item.setText('OPEN')
+        if self.thread.stopper_value == 0:
+            item.setBackground(self.greenbrush)
+            item.setText('CLOSED')
+        if self.thread.stopper_value == -1:
+            item.setBackground(self.graybrush)
+            item.setText('UNKNOWN')
+        palette = self.label.palette()
+        if (myBL.allclosed() == 1 and self.thread.stopper_value == 0):
+            palette.setBrush(QtGui.QPalette.Window, self.greenbrush)
+            self.label.setText('ALL CLOSED')
+        else:
+            palette.setBrush(QtGui.QPalette.Window, self.redbrush)
+            self.label.setText('OPEN/CLOSED')
+        self.label.setPalette(palette)
+        self.label.setAutoFillBackground(1)
+
+    def slot_do_close(self):
+        # first stop aqcusition thread
+        self.timer.stop()
+        self.thread.wait()
+
+        # start execution thread
+        self.thread.mode = 'execute'
+        self.thread.start()
+
+        # post dialog box since there is some time to wait
+        if self.msgbox is None:
+            self.msgbox = QtGui.QProgressDialog('Closing front-ends...', '', 0, 0)
+            self.msgbox.setLabelText('Closing front-ends...')
+            self.msgbox.setCancelButtonText('')
+            self.msgbox.setWindowTitle('BEAMLINE FRONT END')
+            self.msgbox.setModal(True)
+            # How do you remove a button in a dialog????
+            # butt=self.msgbox.button(QtGui.QMessageBox.Close)
+            # as a work-aroud, remove cancel functionality
+            QtCore.QObject.disconnect(self.msgbox, QtCore.SIGNAL('canceled()'), self.msgbox, QtCore.SLOT('cancel()'))
+            self.msgbox.show()
+            QtCore.SIGNAL
+        else:
+            self.msgbox.show()
+
+    def slot_thread_update(self, myBL):
+        # slot called when read is terminated
+        self.redraw_table(myBL)
+
+    def slot_thread_execute(self, myBL):
+        # called when execution thread is terminated normally
+        self.msgbox.close()
+        self.redraw_table(myBL)
+        self.timer.start(3000)
+
+    def slot_thread_execute_error(self, myBL, myerrtable):
+        # called when execution thread is terminated with error
+        self.msgbox.close()
+        self.redraw_table(myBL)
+        self.timer.start(3000)
+        # shuold improve formatting of beamline errors...
+        QtGui.QMessageBox.critical(self.ui, 'front-end close', repr(myerrtable))
+
+    def slot_thread_tango_error(self, myBL, msg):
+        # called when execution thread is terminated with error
+        self.msgbox.close()
+        self.redraw_table(myBL)
+        self.timer.start(3000)
+        # shuold improve formatting of beamline errors...
+        QtGui.QMessageBox.critical(self.ui, 'syrmep front-end close', msg)
+
+    def slot_quit(self):
+        self.timer.stop()
+        self.thread.wait()
diff --git a/FRTND_E/frntd_e.ui b/FRTND_E/frntd_e.ui
new file mode 100644
index 0000000..2d9b84c
--- /dev/null
+++ b/FRTND_E/frntd_e.ui
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>frntd_e</class>
+ <widget class="QDialog" name="frntd_e">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>702</width>
+    <height>1021</height>
+   </rect>
+  </property>
+  <property name="font">
+   <font>
+    <pointsize>10</pointsize>
+   </font>
+  </property>
+  <property name="windowTitle">
+   <string>BEAMLINE FRONT END</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QGridLayout">
+   <item row="0" column="0">
+    <layout class="QHBoxLayout">
+     <item>
+      <layout class="QVBoxLayout">
+       <item>
+        <widget class="QLabel" name="label">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+           <weight>75</weight>
+           <bold>true</bold>
+          </font>
+         </property>
+         <property name="frameShape">
+          <enum>QFrame::Panel</enum>
+         </property>
+         <property name="frameShadow">
+          <enum>QFrame::Sunken</enum>
+         </property>
+         <property name="lineWidth">
+          <number>1</number>
+         </property>
+         <property name="text">
+          <string>ALL CLOSED</string>
+         </property>
+         <property name="textFormat">
+          <enum>Qt::PlainText</enum>
+         </property>
+         <property name="alignment">
+          <set>Qt::AlignCenter</set>
+         </property>
+         <property name="margin">
+          <number>1</number>
+         </property>
+         <property name="textInteractionFlags">
+          <set>Qt::NoTextInteraction</set>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="pushClose">
+         <property name="font">
+          <font>
+           <pointsize>10</pointsize>
+          </font>
+         </property>
+         <property name="text">
+          <string>CLOSE ALL</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer>
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </item>
+     <item>
+      <widget class="QTableWidget" name="tableWidget">
+       <property name="font">
+        <font>
+         <pointsize>9</pointsize>
+        </font>
+       </property>
+       <property name="autoFillBackground">
+        <bool>true</bool>
+       </property>
+       <property name="lineWidth">
+        <number>1</number>
+       </property>
+       <property name="autoScroll">
+        <bool>false</bool>
+       </property>
+       <property name="editTriggers">
+        <set>QAbstractItemView::NoEditTriggers</set>
+       </property>
+       <property name="tabKeyNavigation">
+        <bool>false</bool>
+       </property>
+       <property name="showDropIndicator" stdset="0">
+        <bool>false</bool>
+       </property>
+       <property name="dragDropOverwriteMode">
+        <bool>false</bool>
+       </property>
+       <property name="alternatingRowColors">
+        <bool>true</bool>
+       </property>
+       <property name="selectionMode">
+        <enum>QAbstractItemView::MultiSelection</enum>
+       </property>
+       <property name="selectionBehavior">
+        <enum>QAbstractItemView::SelectRows</enum>
+       </property>
+       <property name="textElideMode">
+        <enum>Qt::ElideNone</enum>
+       </property>
+       <property name="sortingEnabled">
+        <bool>false</bool>
+       </property>
+       <property name="wordWrap">
+        <bool>false</bool>
+       </property>
+       <property name="cornerButtonEnabled">
+        <bool>false</bool>
+       </property>
+       <column>
+        <property name="text">
+         <string>Beamline</string>
+        </property>
+       </column>
+       <column>
+        <property name="text">
+         <string>Point Name</string>
+        </property>
+       </column>
+       <column>
+        <property name="text">
+         <string>Status</string>
+        </property>
+       </column>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/FRTND_E/ui_frntd_e.py b/FRTND_E/ui_frntd_e.py
new file mode 100644
index 0000000..3602c35
--- /dev/null
+++ b/FRTND_E/ui_frntd_e.py
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'frntd_e.ui'
+#
+# Created by: PyQt4 UI code generator 4.12.1
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    def _fromUtf8(s):
+        return s
+
+try:
+    _encoding = QtGui.QApplication.UnicodeUTF8
+    def _translate(context, text, disambig):
+        return QtGui.QApplication.translate(context, text, disambig, _encoding)
+except AttributeError:
+    def _translate(context, text, disambig):
+        return QtGui.QApplication.translate(context, text, disambig)
+
+class Ui_frntd_e(object):
+    def setupUi(self, frntd_e):
+        frntd_e.setObjectName(_fromUtf8("frntd_e"))
+        frntd_e.resize(702, 1021)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        frntd_e.setFont(font)
+        frntd_e.setSizeGripEnabled(True)
+        self.gridlayout = QtGui.QGridLayout(frntd_e)
+        self.gridlayout.setObjectName(_fromUtf8("gridlayout"))
+        self.hboxlayout = QtGui.QHBoxLayout()
+        self.hboxlayout.setObjectName(_fromUtf8("hboxlayout"))
+        self.vboxlayout = QtGui.QVBoxLayout()
+        self.vboxlayout.setObjectName(_fromUtf8("vboxlayout"))
+        self.label = QtGui.QLabel(frntd_e)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        font.setBold(True)
+        font.setWeight(75)
+        self.label.setFont(font)
+        self.label.setFrameShape(QtGui.QFrame.Panel)
+        self.label.setFrameShadow(QtGui.QFrame.Sunken)
+        self.label.setLineWidth(1)
+        self.label.setTextFormat(QtCore.Qt.PlainText)
+        self.label.setAlignment(QtCore.Qt.AlignCenter)
+        self.label.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
+        self.label.setObjectName(_fromUtf8("label"))
+        self.vboxlayout.addWidget(self.label)
+        self.pushClose = QtGui.QPushButton(frntd_e)
+        font = QtGui.QFont()
+        font.setPointSize(10)
+        self.pushClose.setFont(font)
+        self.pushClose.setObjectName(_fromUtf8("pushClose"))
+        self.vboxlayout.addWidget(self.pushClose)
+        spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
+        self.vboxlayout.addItem(spacerItem)
+        self.hboxlayout.addLayout(self.vboxlayout)
+        self.tableWidget = QtGui.QTableWidget(frntd_e)
+        font = QtGui.QFont()
+        font.setPointSize(9)
+        self.tableWidget.setFont(font)
+        self.tableWidget.setAutoFillBackground(True)
+        self.tableWidget.setLineWidth(1)
+        self.tableWidget.setAutoScroll(False)
+        self.tableWidget.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
+        self.tableWidget.setTabKeyNavigation(False)
+        self.tableWidget.setProperty("showDropIndicator", False)
+        self.tableWidget.setDragDropOverwriteMode(False)
+        self.tableWidget.setAlternatingRowColors(True)
+        self.tableWidget.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)
+        self.tableWidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
+        self.tableWidget.setTextElideMode(QtCore.Qt.ElideNone)
+        self.tableWidget.setWordWrap(False)
+        self.tableWidget.setCornerButtonEnabled(False)
+        self.tableWidget.setObjectName(_fromUtf8("tableWidget"))
+        self.tableWidget.setColumnCount(3)
+        self.tableWidget.setRowCount(0)
+        item = QtGui.QTableWidgetItem()
+        self.tableWidget.setHorizontalHeaderItem(0, item)
+        item = QtGui.QTableWidgetItem()
+        self.tableWidget.setHorizontalHeaderItem(1, item)
+        item = QtGui.QTableWidgetItem()
+        self.tableWidget.setHorizontalHeaderItem(2, item)
+        self.hboxlayout.addWidget(self.tableWidget)
+        self.gridlayout.addLayout(self.hboxlayout, 0, 0, 1, 1)
+
+        self.retranslateUi(frntd_e)
+        QtCore.QMetaObject.connectSlotsByName(frntd_e)
+
+    def retranslateUi(self, frntd_e):
+        frntd_e.setWindowTitle(_translate("frntd_e", "BEAMLINE FRONT END", None))
+        self.label.setText(_translate("frntd_e", "ALL CLOSED", None))
+        self.pushClose.setText(_translate("frntd_e", "CLOSE ALL", None))
+        self.tableWidget.setSortingEnabled(False)
+        item = self.tableWidget.horizontalHeaderItem(0)
+        item.setText(_translate("frntd_e", "Beamline", None))
+        item = self.tableWidget.horizontalHeaderItem(1)
+        item.setText(_translate("frntd_e", "Point Name", None))
+        item = self.tableWidget.horizontalHeaderItem(2)
+        item.setText(_translate("frntd_e", "Status", None))
+
diff --git a/TCPSserver/README b/TCPSserver/README
new file mode 100644
index 0000000..f111021
--- /dev/null
+++ b/TCPSserver/README
@@ -0,0 +1,20 @@
+Il servzio TCPS viene gestito da un certo numero di istanze differenti con port number assegnato in modo da ripartire il carico,
+le uscite da bending - per ora - leggono tutte dalla stessa istanza.
+
+Le porte vanno assegnate per corrispondere al range di bcs da 1.1 (11) A 11.2 (112)
+011 	TWIN mIC : 20011
+012 	FEL - Nanospectroscopy : 20012
+022 	SuperESCA - Escamicroscopy : 20022
+032 	VUV photoemission - Spectromicroscopy : 20032
+042 	Circularly Polarized : 20042
+052 	X-ray diffraction - SAXS : 20052
+061 	SYRMEP - MSB : 20061
+062 	Gas Phase : 20062
+072 	ALOISA : 20072
+081 	Lilit - BEAR : 20081
+082 	Bach : 20082
+092 	APE : 20092
+101 	Microfabrication : 20101
+102 	Iuvs BaDElph : 20102
+111 	Exsafs :  20111
+112 	Xrd2  :   20112 (previsto ma non attivato,  ci sara' un srver tango diretto)
\ No newline at end of file
diff --git a/TCPSserver/TCPS2tango.coverage b/TCPSserver/TCPS2tango.coverage
new file mode 100644
index 0000000000000000000000000000000000000000..6be62e646ae741c1f75f2a69a24eb48b40ea61f7
GIT binary patch
literal 81963
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
D^9#f7

literal 0
HcmV?d00001

diff --git a/TCPSserver/TCPS2tango.py b/TCPSserver/TCPS2tango.py
new file mode 100644
index 0000000..4d3ad64
--- /dev/null
+++ b/TCPSserver/TCPS2tango.py
@@ -0,0 +1,390 @@
+# parse,check,translate TCPS to tango
+# and exec tabled actions
+
+
+import string
+import sys
+import PyTango
+
+#module wide constants
+okmsg = 'Command execution OK'
+errmsg_header = '*** ERROR'
+term = "\r\n"
+
+
+#################################################################################################
+#utilities - taken from tangoclient.py to prpperly convert/assign types to command and attributes
+#from strings
+
+def convertToAttributeValue(pars,  info, logger):
+    logger.debug( 'ConvertToAttribute() entering...')
+    #val = PyTango.AttributeValue()
+    #val.name = info.name
+    logger.debug( 'ConvertToAttribute() entered...')
+    if info.data_format == PyTango.SCALAR:
+        if info.data_type ==  PyTango.DevBoolean:
+            if pars[0] == '0' or pars[0].lower() == 'false':
+                value = False
+            else:
+                value = True
+        elif info.data_type == PyTango.DevFloat or info.data_type == PyTango.DevDouble:
+            value = float(pars[0])
+        elif info.data_type == PyTango.ConstDevString or info.data_type == PyTango.DevString or info.data_type == PyTango.DevUChar:
+            value = pars[0]
+        elif info.data_type == PyTango.DevLong or info.data_type == PyTango.DevShort or info.data_type == PyTango.DevULong or info.data_type == PyTango.DevUShort:
+            value = int(pars[0])
+    elif info.data_format == PyTango.SPECTRUM:
+        temp = list()
+        if info.data_type ==  PyTango.DevBoolean:
+            for p in pars:
+                if p == '0' or p.lower() == 'false':
+                    temp.append(False)
+                else:
+                    temp.append(True)
+        elif info.data_type == PyTango.DevFloat or info.data_type == PyTango.DevDouble:
+            for p in pars:
+                temp.append(float(p))
+        elif info.data_type == PyTango.ConstDevString or info.data_type == PyTango.DevString or info.data_type == PyTango.DevUChar:
+            temp = pars
+        elif info.data_type == PyTango.DevLong or info.data_type == PyTango.DevShort or info.data_type == PyTango.DevULong or info.data_type == PyTango.DevUShort:
+            temp.append(int(p))
+        value = temp
+    return value
+
+####---------------------------------------------------------------------------------------------
+
+def convertToCommandInput(pars, mtype):
+    if mtype == PyTango.DevBoolean:
+        if pars[0] == '0' or pars[0].lower() == 'false':
+            return False
+        else:
+            return True
+    elif mtype == PyTango.DevFloat or mtype == PyTango.DevDouble:
+        return float(pars[0])
+    elif mtype == PyTango.ConstDevString or mtype == PyTango.DevString or mtype == PyTango.DevUChar:
+        return pars[0]
+    elif mtype == PyTango.DevLong or mtype == PyTango.DevShort or mtype == PyTango.DevULong or mtype == PyTango.DevUShort:
+        return int(pars[0])
+
+    if mtype == PyTango.DevVarBooleanArray:
+        temp = list()
+        for p in pars:
+            if p == '0' or p.lower() == 'false':
+                temp.append(False)
+            else:
+                temp.append(True)
+        return temp
+    elif mtype == PyTango.DevVarFloatArray or mtype == PyTango.DevVarDoubleArray:
+        temp = list()
+        for p in pars:
+            temp.append(float(p))
+        return temp
+    elif mtype == PyTango.DevVarStringArray:
+        return pars
+    elif mtype == PyTango.DevVarLongArray or mtype == PyTango.DevVarShortArray or mtype == PyTango.DevVarULongArray or mtype == PyTango.DevVarUShortArray:
+        temp = list()
+        for p in pars:
+            temp.append(int(p))
+        return temp
+    else:
+        return None
+
+
+#################################################################################################
+
+class ProxyContainer(object):
+
+    """
+     This class parses the configuration files,
+     build the approriate TCPSproxyes and inserts the in a map.
+
+    :version:
+    :author:
+    """
+    def __init__(self):
+        #init to empty dictionaries the two main dispatch tables
+        self.get_dict = {}
+        self.set_dict = {}
+    def add_logger(self, addedlogger):
+        self.logger = addedlogger
+    def parse_conf_file(self, fname):
+        """
+
+        @param string fname : 
+        @return  :
+        @author
+        """
+        self.logger.debug('ProxyContainer.parse_conf_file() parsing: '+fname)
+        try:
+            conf_file = open(fname,'r')
+        except:
+            self.logger.fatal( 'ProxyContainer.parse_conf_file() fatal error opening conf_file: '+fname)
+            raise #impossible to continue....
+        count = 0
+        result = True
+        for rawline in conf_file.readlines():
+            if not rawline.strip():
+                continue  #discard empty lines
+            count = count+1
+            line=' '.join(rawline.split()) # collapse multiple white spaces into single white space
+            if(line[0]=='#' or line[0]=='*' or not line.strip()) : #discard comment and empyt lines
+                continue
+            datum=string.split(line,' ')
+            if (datum[0]!='GET' and datum[0] !='SET'):
+                result = False
+                self.logger.error( 'ProxyContainer: parse_conf_file error on line '+repr(count) +' '+ datum[0])
+                return result
+            if(datum[0]=='GET'):
+                if datum[1] not in self.get_dict:
+                    tangostring = datum[-1]
+                    if tangostring.count('->') ==1:
+                        px = ProxyCommand(tangostring.strip(),self.logger)
+                    elif  tangostring.count('/') >=3:
+                        px = ProxyAttribute(tangostring.strip(),self.logger)
+                    self.get_dict[datum[1]] = px
+                else:
+                    result=False
+                    self.logger.error( 'ProxyContainer: parse_conf_file error on line '+repr(count)+' : SET duplicate '+datum[1])
+                    return result
+
+            if(datum[0]=='SET'):
+                #create special keys for searching - must include also list of parameter names
+                skey = datum[1]
+                for s in datum[2:-1]:
+                    skey = skey+'_'+s
+                if skey not in self.set_dict:
+                    tangostring = datum[-1]
+                    if tangostring.count('->') ==1:
+                        px = ProxyCommand(tangostring.strip(),self.logger)
+                    elif  tangostring.count('/') >=3:
+                        self.logger.debug('Inserting SET attribute '+tangostring.strip()+' with key: '+skey)
+                        px = ProxyAttribute(tangostring.strip(),self.logger)
+                    self.set_dict[skey] = px
+                else:
+                    result=False
+                    self.logger.error( 'ProxyContainer: parse_conf_file error on line '+repr(count)+' : SET duplicate '+repr(datum))
+                    return result
+
+        return result
+
+
+    def dispatch_call(self, data):
+        """
+         use "data" for finding the appropriate TCPSproxy, then invoches the appropriate
+         operation to it.
+
+        @param string data : 
+        @return string :
+        @author
+        """
+        #print 'ProxyContainer: dispacth_call '+data
+        self.logger.debug('processing '+data)
+        try:
+            cleandata=' '.join(data.split()) # collapse multiple white spaces into single white space
+            selector=string.split(cleandata," ")
+            self.logger.debug('processing selector ' +selector[0])
+        except:
+            self.logger.error('message not correctly configured:'+data)
+            return errmsg_header + ' message not correctly configured'+term
+        try:
+            if selector[0]=='GET':
+                if self.get_dict.has_key(selector[1]):
+                    handler=self.get_dict[selector[1]]
+                    resp=handler.get()
+                    if(resp==None):
+                        self.logger.error('not correctly handled: '+data)
+                        return errmsg_header +' not correctly handled'+term
+                    return resp
+                else:
+                    self.logger.error(selector[1] + ' is not configured as GET point')
+                    return  errmsg_header + ' ' +selector[1]+' is not configured as GET point'+term
+
+            elif selector[0]=='SET':
+                self.logger.debug('processing SET...selector : '+selector[1])
+                skey=selector[1]
+                valuelist=[]
+                for s in selector[2:]:
+                    arg=s.split(',')
+                cmd=arg[0]
+                for v in arg[1:]:
+                    valuelist.append(v)
+                    self.logger.debug('processing SET..adding to valuelist: '+v)
+                skey=skey+'_'+cmd
+                self.logger.debug('processing SET...searching for '+skey)
+                if self.set_dict.has_key(skey):
+                    handler=self.set_dict[skey]
+                    if (handler==None):
+                        self.logger.error('SET: handler not found for: '+skey)
+                    self.logger.debug('processing SET...calling set() for device... ')
+                    resp=handler.set(valuelist)
+                    self.logger.debug('processing SET..set() called or device... ')
+                    if(resp==None):
+                        self.logger.error('not correctly handled: '+data)
+                        return errmsg_header + ' not correctly handled'+term
+                    return resp
+                else:
+                    self.logger.debug(selector[1] + ' is not configured as SET point')
+                    return  errmsg_header +' '+selector[1] +' is  not configured as SET point'+term
+            # first field is neither SET nor GET... error!
+            self.logger.error('not correctly configured: '+data)
+            return errmsg_header +' not correctly configured'+term
+        except:
+            self.logger.error('exception processing data:' + data)
+
+##########################################################################################
+# 'abstract' class for Proxy Objects
+class Proxy(object):
+    def get(self):
+        pass
+    def set(self,data):
+        pass
+##########################################################################################
+class ProxyAttribute(Proxy):
+    def __init__(self, attrname, log):
+        pos=attrname.rfind('/')
+        self.__attribute=attrname[(pos+1):].strip() #get read of terminating chrartcers if left
+        self.__devname=attrname[:pos]
+        self.__attrinfo=0
+        self.logger=log
+        try:
+            self.__device=PyTango.DeviceProxy(self.__devname)
+            #self.__attrinfo=self.__device.get_attribute_config(self.__attribute)
+        except:
+            self.logger.error( 'ProxyAttribute.init(): failed to create '+self.__devname+' for: '+attrname)
+            return None
+        try:
+            self.__attrinfo=self.__device.get_attribute_config(self.__attribute)
+        except:
+            self.__attrinfo=0
+            self.logger.error( 'ProxyAttribute.init(): failed to create self.__attrinfo for: '+self.__devname+'/'+self.__attribute)
+            return None
+        self.logger.debug('ProxyAttribute init() OK: '+self.__devname+'/'+self.__attribute)
+
+    def get(self):
+        error=False
+        if self.__attrinfo==0:
+            try:
+                self.logger.debug( 'ProxyAttribute.get(): getting attr config for : '+self.__devname+'/'+self.__attribute)
+                self.__attrinfo=self.__device.get_attribute_config(self.__attribute)
+            except:
+                self.logger.error( 'ProxyAttribute.get(): failed to create self.__attrinfo for: '+self.__devname+'/'+self.__attribute)
+                self.__attrinfo=0
+                error=True
+                #rstat='BEN-------' #simplicistic error notification !
+                #resp='R'+','+'?'+','+rstat+','+0+term
+                return 'R,?,BEN------,0'+term
+        try:
+            #self.logger.debug( 'ProxyAttribute.get(): reading : '+self.__devname)
+            attr=self.__device.read_attribute(self.__attribute) #read_attribute_as_string ????
+            val=attr.value
+            #self.logger.debug( 'ProxyAttribute.get(): reading value ok')
+        except PyTango.DevFailed,myex:
+            des0=myex[0].desc
+            self.logger.error ('GET: '+self.__devname+'/'+self.__attribute+' failed with exception '+des0)
+            #print 'ProxyAttribute: get() '+self.__attribute+' ERROR'
+            val=0
+            error=True
+
+        # analyze result and prepare answer
+        rtype='?'
+        racq='R' #fixed
+        if self.__attrinfo.data_format == PyTango.SCALAR:
+            if self.__attrinfo.data_type ==  PyTango.DevBoolean:
+                rtype='D'
+                if val:
+                    rvalue='1,'+self.__attrinfo.unit
+                else:
+                    rvalue='0,'+self.__attrinfo.unit
+            if self.__attrinfo.data_type ==  PyTango.DevDouble or self.__attrinfo.data_type ==  PyTango.DevFloat:
+                self.logger.debug( 'ProxyAttribute.get(): processing float...')
+                rtype='A'
+                rvalue=self.__attrinfo.format % val + ','+self.__attrinfo.unit
+                self.logger.debug( 'ProxyAttribute.get(): processing float:'+rvalue)
+            if self.__attrinfo.data_type == PyTango.DevLong or self.__attrinfo.data_type == PyTango.DevShort or self.__attrinfo.data_type == PyTango.DevULong or self.__attrinfo.data_type == PyTango.DevUShort:
+                rtype='I'
+                rvalue=self.__attrinfo.format % val + ','+self.__attrinfo.unit
+        if self.__attrinfo.data_type== 19: #pyTango.DevState
+            rtype='I'
+            rvalue= '%d'% int(val) + ','+self.__attrinfo.unit
+            if(error):
+                rstat='BEN-------' #simplicistic error notification !
+            else:
+                rstat='----------'
+        elif self.__attrinfo.data_format == PyTango.SPECTRUM and self.__attrinfo.data_type ==  PyTango.DevBoolean:
+            # special handling of bool spectrum - which are turned into bit masks or Bitmap
+            rtype='B'
+            longval=0
+            mask=0x1
+            count = 0
+            #if self.__attrinfo.writable==PyTango._PyTango.AttrWriteType.READ_WRITE :
+            numbits=attr.dim_x #make sure to get ALWAY the Read values, also with READ_WRITE attributes
+            
+            if self.__devname.rfind('vlvfe') > 0: #workaround for different bitmaps of new valves. Dirty but... C.S. nov. 2016
+                numbits=3 #show only open close local bits - better solution must implelemented
+
+            for p in val:
+                count = count + 1
+                if count >32 or count > numbits:
+                    break
+                # stuff bits into bitmap - max 64 bits
+
+                if p:
+                    longval= longval | mask
+                mask = mask << 1
+            rvalue= '%d' % longval +','+self.__attrinfo.unit
+        if(error):
+            rstat='BEN-------' #simplicistic error notification !
+        else:
+            rstat='----------'
+        resp=racq+','+rtype+','+rstat+','+rvalue+term
+        self.logger.debug( 'ProxyAttribute.get(): about to return:'+resp)
+        return resp
+
+
+#------------------------------------------------------------------
+# set takes value in imput - use python list for arrays    
+    def set(self,data):
+        self.logger.debug( 'ProxyAttribute.set() entering for '+self.__devname+'/'+self.__attribute)
+        if self.__attrinfo==0:
+            try:
+                self.__attrinfo=self.__device.get_attribute_config(self.__attribute)
+            except PyTango.DevFailed,e:
+                des=e[0].desc
+                errmsg= errmsg_header+ ' in perform command : '+des
+                self.logger.error( 'ProxyAttribute.set(): failed to create self.__attrinfo for: '+self.__devname+'/'+self.__attribute)
+                self.__attrinfo=0
+                return errmsg+des+term
+        try:
+            #self.logger.debug( 'ProxyAttribute.set(): converting attribute for '+self.__devname+'/'+self.__attribute)
+            val=convertToAttributeValue(data,self.__attrinfo,self.logger)
+            self.logger.debug( 'ProxyAttribute.set(): for '+self.__devname+'/'+self.__devname+'/'+self.__attribute)
+            self.__device.write_attribute(self.__attrinfo,val)
+            self.logger.info( 'SET: ACCEPT'+self.__devname+'/'+self.__attribute+' '+data[0])
+            return okmsg+term
+        except PyTango.DevFailed,myex:
+            des0=myex[0].desc
+            self.logger.debug ('SET: '+self.__devname+'/'+self.__attribute+' failed with exception '+des0)
+            msg =  errmsg_header +' in perform command : '
+            self.logger.debug('msg:'+msg)
+            if des0.find('RESPINTA')>1:
+                msg =  errmsg_header + ' in access violation : '
+                self.logger.info( 'SET: REJECT '+self.__devname+'/'+self.__attribute+' '+data[0])
+            else:
+                msg =  errmsg_header + ' in perform command : '
+                self.logger.info ('SET: '+self.__devname+'/'+self.__attribute+' failed with exception '+des0)
+            return msg+des0+term
+
+
+########################################################################################
+class ProxyCommand(Proxy):
+    def __init__(self,cmdname,log):
+        pos=cmdname.rfind('->')
+        self.__command=cmdname[(pos+2):].strip()
+        self.__devname=cmdname[:pos]
+        self.logger=log
+        try:
+            self.__device=PyTango.DeviceProxy(self.__devname)
+            self.type=self.__device.command_query(self.__command)
+        except:
+            self.logger.error('ProxyCommand():  failed to create '+self.__devname)
+########################################################################################
diff --git a/TCPSserver/TCPSserver.e4p b/TCPSserver/TCPSserver.e4p
new file mode 100644
index 0000000..7ec4265
--- /dev/null
+++ b/TCPSserver/TCPSserver.e4p
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE Project SYSTEM "Project-4.6.dtd">
+<!-- eric4 project file for project TCPSserver -->
+<!-- Saved: 2012-02-24, 14:20:40 -->
+<!-- Copyright (C) 2012 ,  -->
+<Project version="4.6">
+  <Language></Language>
+  <ProgLanguage mixed="0">Python</ProgLanguage>
+  <ProjectType>Console</ProjectType>
+  <Description></Description>
+  <Version>0.1</Version>
+  <Author></Author>
+  <Email></Email>
+  <Sources>
+    <Source>TCPStwserver.py</Source>
+    <Source>TCPS2tango.py</Source>
+  </Sources>
+  <Forms>
+  </Forms>
+  <Translations>
+  </Translations>
+  <Resources>
+  </Resources>
+  <Interfaces>
+  </Interfaces>
+  <Others>
+  </Others>
+  <MainScript>TCPStwserver.py</MainScript>
+  <Vcs>
+    <VcsType>CVS</VcsType>
+    <VcsOptions>
+      <dict>
+        <key>
+          <string>add</string>
+        </key>
+        <value>
+          <list>
+            <string></string>
+          </list>
+        </value>
+        <key>
+          <string>checkout</string>
+        </key>
+        <value>
+          <list>
+            <string></string>
+          </list>
+        </value>
+        <key>
+          <string>commit</string>
+        </key>
+        <value>
+          <list>
+            <string></string>
+          </list>
+        </value>
+        <key>
+          <string>diff</string>
+        </key>
+        <value>
+          <list>
+            <string>-u3</string>
+            <string>-p</string>
+          </list>
+        </value>
+        <key>
+          <string>export</string>
+        </key>
+        <value>
+          <list>
+            <string></string>
+          </list>
+        </value>
+        <key>
+          <string>global</string>
+        </key>
+        <value>
+          <list>
+            <string>-f</string>
+            <string>-z3</string>
+          </list>
+        </value>
+        <key>
+          <string>history</string>
+        </key>
+        <value>
+          <list>
+            <string>-e</string>
+            <string>-a</string>
+          </list>
+        </value>
+        <key>
+          <string>log</string>
+        </key>
+        <value>
+          <list>
+            <string></string>
+          </list>
+        </value>
+        <key>
+          <string>remove</string>
+        </key>
+        <value>
+          <list>
+            <string>-f</string>
+          </list>
+        </value>
+        <key>
+          <string>status</string>
+        </key>
+        <value>
+          <list>
+            <string>-v</string>
+          </list>
+        </value>
+        <key>
+          <string>tag</string>
+        </key>
+        <value>
+          <list>
+            <string>-c</string>
+          </list>
+        </value>
+        <key>
+          <string>update</string>
+        </key>
+        <value>
+          <list>
+            <string>-dP</string>
+          </list>
+        </value>
+      </dict>
+    </VcsOptions>
+    <VcsOtherData>
+      <dict>
+      </dict>
+    </VcsOtherData>
+  </Vcs>
+  <FiletypeAssociations>
+    <FiletypeAssociation pattern="*.pyw" type="SOURCES" />
+    <FiletypeAssociation pattern="*.idl" type="INTERFACES" />
+    <FiletypeAssociation pattern="*.py" type="SOURCES" />
+    <FiletypeAssociation pattern="*.ptl" type="SOURCES" />
+  </FiletypeAssociations>
+  <Checkers>
+    <CheckersParams>
+      <dict>
+        <key>
+          <string>PYLINT</string>
+        </key>
+        <value>
+          <dict>
+            <key>
+              <string>dialogReport</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>enableBasic</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>enableClasses</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>enableDesign</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>enableExceptions</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>enableFormat</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>enableImports</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>enableMetrics</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>enableMiscellaneous</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>enableNewstyle</string>
+            </key>
+            <value>
+              <bool>False</bool>
+            </value>
+            <key>
+              <string>enableRPython</string>
+            </key>
+            <value>
+              <bool>False</bool>
+            </value>
+            <key>
+              <string>enableSimilarities</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>enableTypecheck</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>enableVariables</string>
+            </key>
+            <value>
+              <bool>True</bool>
+            </value>
+            <key>
+              <string>htmlReport</string>
+            </key>
+            <value>
+              <bool>False</bool>
+            </value>
+            <key>
+              <string>reportFile</string>
+            </key>
+            <value>
+              <unicode>pylint.html</unicode>
+            </value>
+            <key>
+              <string>txtReport</string>
+            </key>
+            <value>
+              <bool>False</bool>
+            </value>
+          </dict>
+        </value>
+      </dict>
+    </CheckersParams>
+  </Checkers>
+</Project>
\ No newline at end of file
diff --git a/TCPSserver/TCPStwserver.py b/TCPSserver/TCPStwserver.py
new file mode 100755
index 0000000..d9368be
--- /dev/null
+++ b/TCPSserver/TCPStwserver.py
@@ -0,0 +1,152 @@
+#!/usr/bin/env python
+#  TCPS server-bridge based on twisted
+from twisted.internet.protocol import Protocol, Factory
+from twisted.internet import reactor
+import time
+import sys
+import TCPS2tango
+import logging
+import logging.handlers
+
+#obsolete! must be switched to argparse
+import optparse
+
+global_logging=logging.getLogger('TCPS') 
+# there should be a cleaner  way ... but now I use a GLOBAL.....
+#--------------------------------------------------------------
+
+class twistedTCPS(Protocol):
+    'adapter of TCPS protocol for twisted package'
+    def __init__(self):
+        self.__myname='default TCPS server'
+    def connectionMade(self):
+        if(self.factory._timeout):
+            self.transport.socket.settimeout(self.factory._timeout) # it is possible to set timeouts!!
+        self.__peer=self.transport.getPeer()
+        global_logging.info ('new connection: ' + self.__peer.host + ':' + repr(self.__peer.port))
+
+    def connectionLost(self, reason):
+        self.transport.loseConnection()
+        global_logging.info('connection closed/lost: ' + self.__peer.host + ':' + repr(self.__peer.port))
+
+    def dataReceived(self, data):
+        try:
+            resp=self.factory.handler.dispatch_call(data.strip())
+            self.transport.write(resp)
+        except:
+            global_logging.error ('exception writing data to ' + self.__peer.host + ':' + repr(self.__peer.port))
+
+# method to associate TCPS object and other initialization data
+def makeTCPSFactory(fname,logger,timeout=None,):
+    factory=Factory()
+    factory.protocol=twistedTCPS
+    factory._fname=fname
+    factory._timeout=timeout
+    factory.handler=TCPS2tango.ProxyContainer()
+    factory.handler.add_logger(logger)
+    factory.handler.parse_conf_file(fname)
+    
+    return factory
+
+#-----------------------------------------------------------------
+#remeber to switch  use argparse for configuring cmd line options with python > 2.7
+
+def main(argv=None):
+    if argv is None:
+        argv = sys.argv # argv for initializing , etc
+
+    #parse comnd line and prepare optinal arguments
+    parser = optparse.OptionParser(description='TCPStwserver options')
+    parser.add_option('-f','--configfile',help='config_file')
+    parser.add_option('-p', '--port', help='tpc port number [20000]')
+    parser.add_option('-l','--logfile',help='log_file')
+    parser.add_option('-v','--loglevel',help='log_level [debug|info|warning|error|critical]')
+    parser.add_option('-s','--logsize',help='log_file_size')
+    parser.add_option('-V','--verbose',help='echo debug to console')
+    (options,argmy) = parser.parse_args()
+    if options.configfile:
+        fname=options.configfile
+    else:
+        print 'usage: '+sys.argv[0] + ' --configfile= '
+        return 1
+
+    if options.port:
+        tcpport=int(options.port)
+    else:
+        tcpport=20000
+
+    if options.logfile:
+        lfile=options.logfile
+    else:
+        lfile='/dev/null'
+
+    if options.loglevel:
+        lev=options.loglevel
+        level=-1
+        if lev=='debug':
+            level=logging.DEBUG
+        elif lev=='info':
+            level=logging.INFO
+        elif lev=='warning':
+            level=logging.WARNING
+        elif lev=='error':
+            level=logging.ERROR
+        elif lev=='critical':
+            level=logging.CRITICAL
+        elif lev=='notset':
+            level==logging.NOTSET
+    else:
+        lev='notset'
+        level=logging.NOTSET
+
+    if options.logsize:
+        mBytes=int(options.logsize)
+    else:
+        mBytes=2196608
+
+    if options.verbose:
+        verbose=True
+    else:
+        verbose=False
+
+    # Set up a specific logger with our desired output level
+    # use INFO for for tracking all SET operations
+    # use ERROR and CRITICAL for errors (non-fatal and fatal)
+    # use INFO and DEBUG for diagnostics
+    # info is set with -V
+    #debug is set
+    logger = logging.getLogger('TCPS')
+    logger.setLevel(level) #default level is NOTSET
+    formatter = logging.Formatter("%(asctime)s\t%(levelname)s\t%(message)s")
+
+    # Add the log message handler to the logger
+    handler = logging.handlers.RotatingFileHandler(lfile, maxBytes=mBytes, backupCount=5)
+
+    # create and add formatter to logger
+    handler.setFormatter(formatter)
+
+    logger.addHandler(handler)
+
+    if verbose:
+        ch = logging.StreamHandler()
+        ch.setLevel(level)
+        ch.setFormatter(formatter)
+        logger.addHandler(ch)
+        logger.info('debug echo to console')
+
+    # use special  builder to associate our data to TCPS object
+    # extra arguments are:
+    #    'internal name'
+    #    timeout for network calls
+    logger.info('using config file '+fname)
+    factory=makeTCPSFactory(fname,logger)
+
+    # 20000 is the port assigned to TPCS - 30 seconds timeount
+    reactor.listenTCP(tcpport, factory,30.0)
+    # we can also  open on multiple ports, just make another instance another reactor object
+    #reactor.listenTCP(30000, factory,30.0)
+    logger.debug('entering loop')
+    reactor.run()
+    logger.debug('exit loop')
+if __name__ == "__main__":
+    sys.exit(main())
diff --git a/TCPSserver/TODO b/TCPSserver/TODO
new file mode 100644
index 0000000..c727ff6
--- /dev/null
+++ b/TCPSserver/TODO
@@ -0,0 +1,2 @@
+- analizzare "exception processing data"
+- Transient CORBA excpetion:come si alza il timeout?
\ No newline at end of file
diff --git a/TCPSserver/elettrabcsbridge.cfg b/TCPSserver/elettrabcsbridge.cfg
new file mode 100644
index 0000000..e7dd976
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge.cfg
@@ -0,0 +1,329 @@
+#configuration  file for elettra-Tango  to BCS bridge
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+GET FRONTEND_MACHINE_MACHINE_1_P120S01M tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s01.03/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P120S012 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S1.7_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P120S101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s10.03/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P120S102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s10.07/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P120S111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s11.03/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P120S112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s11.07/Pressure
+GET 022F_MACHINE_MACHINE_1_P120S022     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S2.7_PRES_RR
+GET 032F_MACHINE_MACHINE_1_P120S032     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s03.07/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P120S042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s04.07/Pressure
+GET 052F_MACHINE_MACHINE_1_P120S052     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S5.7_PRES_RR
+GET 061F_MACHINE_MACHINE_1_P120S061     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S6.3_PRES_RR
+GET 062F_MACHINE_MACHINE_1_P120S062     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S6.7_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P120S071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S7.3_PRES_RR
+GET 072F_MACHINE_MACHINE_1_P120S072     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S7.7_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P120S081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S8.3_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P120S082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S8.7_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P120S092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s09.07/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s01.01/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s01.01/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s10.01/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s10.02/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s11.01/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s11.02/Pressure
+GET 022F_MACHINE_MACHINE_1_P400S022     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S2.2_PRES_RR
+GET 032F_MACHINE_MACHINE_1_P400S032     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s03.02/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s04.02/Pressure
+GET 052F_MACHINE_MACHINE_1_P400S052     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S5.2_PRES_RR
+GET 061F_MACHINE_MACHINE_1_P400S061     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S6.1_PRES_RR
+GET 062F_MACHINE_MACHINE_1_P400S062     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S6.2_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P400S071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S7.1_PRES_RR
+GET 072F_MACHINE_MACHINE_1_P400S072     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S7.2_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P400S081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S8.1_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P400S082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S8.2_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P400S091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S9.1_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P400S092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s09.02/Pressure
+
+
+#front-end VLVFE readings
+GET FRONTEND_MACHINE_MACHINE_1_VALVE01M tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s1.1m/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE012 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S1.2_STAT_RF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s10.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s10.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s11.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s12.2/StatRF
+GET 022F_MACHINE_MACHINE_1_VALVE022     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S2.2_STAT_RF
+GET 032F_MACHINE_MACHINE_1_VALVE032     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s3.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s4.2/StatRF
+GET 052F_MACHINE_MACHINE_1_VALVE052     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S5.2_STAT_RF
+GET 061F_MACHINE_MACHINE_1_VALVE061     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S6.1_STAT_RF
+GET 062F_MACHINE_MACHINE_1_VALVE062     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S6.2_STAT_RF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S7.1_STAT_RF
+GET 072F_MACHINE_MACHINE_1_VALVE072     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S7.2_STAT_RF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S8.1_STAT_RF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S8.2_STAT_RF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S9.1_STAT_RF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s9.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_VALVB011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvbe_s1/StatRF
+
+#front-end PHOTON SHUTTER readings
+GET FRONTEND_MACHINE_MACHINE_1_SHUT01M tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.1m/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s10.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s10.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s11.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s11.2/StatRF
+GET 022F_MACHINE_MACHINE_1_SHUT022     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s2.2/StatRF
+GET 032F_MACHINE_MACHINE_1_SHUT032     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s3.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s4.2/StatRF
+GET 052F_MACHINE_MACHINE_1_SHUT052     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s5.2/StatRF
+GET 061F_MACHINE_MACHINE_1_SHUT061     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s6.1/StatRF
+GET 062F_MACHINE_MACHINE_1_SHUT062     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s6.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT071 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s7.1/StatRF
+GET 072F_MACHINE_MACHINE_1_SHUT072     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s7.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT081 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s8.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT082 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s8.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT091 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s9.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s9.2/StatRF
+
+#beam positions and angles at centre of straigth sections
+GET 012F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S1
+GET 012F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S1
+GET 012F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S1
+GET 012F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S1
+
+GET 022F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S2
+GET 022F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S2
+GET 022F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S2
+GET 022F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S2
+
+
+GET 032F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S3
+GET 032F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S3
+GET 032F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S3
+GET 032F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S3
+
+
+GET 042F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S4
+GET 042F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S4
+GET 042F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S4
+GET 042F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S4
+
+GET 052F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S5
+GET 052F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S5
+GET 052F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S5
+GET 052F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S5
+
+GET 062F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S6
+GET 062F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S6
+GET 062F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S6
+GET 062F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S6
+
+
+GET 072F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S7
+GET 072F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S7
+GET 072F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S7
+GET 072F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S7
+
+GET 082F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S8
+GET 082F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S8
+GET 082F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S8
+GET 082F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S8
+
+GET 092F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S9
+GET 092F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S9
+GET 092F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S9
+GET 092F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S9
+
+GET 102F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S10
+GET 102F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S10
+GET 102F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S10
+GET 102F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S10
+
+GET 112F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S11
+GET 112F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S11
+GET 112F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S11
+GET 112F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S11
+#beam positions and angles at exit  of bending magnets
+
+GET 061F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B6
+GET 061F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B6
+GET 061F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B6
+GET 061F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B6
+
+GET 071F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B7
+GET 071F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B7
+GET 071F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B7
+GET 071F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B7
+
+GET 081F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B8
+GET 081F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B8
+GET 081F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B8
+GET 081F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B8
+
+GET 091F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B9
+GET 091F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B9
+GET 091F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B9
+GET 091F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B9
+
+GET 101F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B10
+GET 101F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B10
+GET 101F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B10
+GET 101F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B10
+
+GET 111F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B11
+GET 111F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B11
+GET 111F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B11
+GET 111F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B11
+
+#beam positions and angles at short straight sections
+
+
+GET 011F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_SS1
+GET 011F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_SS1
+GET 011F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_SS1
+GET 011F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_SS1
+
+#ID1 readings
+GET FRONTEND_MACHINE_MACHINE_1_GAP011       sr/id/id_s1.1/Gap
+GET FRONTEND_MACHINE_MACHINE_1_GAP012       sr/id/id_s1.2/Gap
+GET FRONTEND_MACHINE_MACHINE_1_PHA011       sr/id/id_s1.1/Phase
+GET FRONTEND_MACHINE_MACHINE_1_PHA012       sr/id/id_s1.2/Phase
+GET FRONTEND_MACHINE_MACHINE_1_GAPS011      sr/id/id_s1.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_GAPS012      sr/id/id_s1.2/StatRF
+
+#ID1 settings
+SET FRONTEND_MACHINE_MACHINE_1_GAP011 GAP011 sr/id/id_s1.1/Gap
+SET FRONTEND_MACHINE_MACHINE_1_GAP012 GAP012 sr/id/id_s1.2/Gap
+SET FRONTEND_MACHINE_MACHINE_1_PHA011 PHA011 sr/id/id_s1.1/Phase
+SET FRONTEND_MACHINE_MACHINE_1_PHA012 PHA012 sr/id/id_s1.2/Phase
+
+#PSMOD1 readings
+GET FRONTEND_MACHINE_MACHINE_1_IM012       sr/id/psmod_s1/Current
+GET FRONTEND_MACHINE_MACHINE_1_M012        sr/id/psmod_s1/StatRF
+
+#PSMOD1 settings
+SET FRONTEND_MACHINE_MACHINE_1_IM012 IM012 sr/id/psmod_s1/Current
+
+
+#ID2 readings
+GET 022F_MACHINE_MACHINE_1_GAP021       blproxy/id/id_s2/Gap
+GET 022F_MACHINE_MACHINE_1_TAP021       blproxy/id/id_s2/Tapering
+GET 022F_MACHINE_MACHINE_1_GAPS020      blproxy/id/id_s2/StatRF
+
+#ID2 settings
+SET 022F_MACHINE_MACHINE_1_GAP021    VALGAP blproxy/id/id_s2/Gap
+SET 022F_MACHINE_MACHINE_1_TAP021    VALGAP blproxy/id/id_s2/Tapering
+
+
+#ID3 readings
+GET 032F_MACHINE_MACHINE_1_GAP031       sr/id/id_s3/Gap1
+GET 032F_MACHINE_MACHINE_1_GAP032       sr/id/id_s3/Gap2
+GET 032F_MACHINE_MACHINE_1_GAP033       sr/id/id_s3/Gap3
+GET 032F_MACHINE_MACHINE_1_GAPS030      sr/id/id_s3/StatRF
+
+#ID3 settings
+SET 032F_MACHINE_MACHINE_1_GAP031    GAP031 sr/id/id_s3/Gap1
+SET 032F_MACHINE_MACHINE_1_GAP032    GAP032 sr/id/id_s3/Gap2
+SET 032F_MACHINE_MACHINE_1_GAP033    GAP033 sr/id/id_s3/Gap3
+SET 032F_MACHINE_MACHINE_1_GAP030    VALUE sr/id/id_s3/Gapall
+
+#ID4 readings
+GET FRONTEND_MACHINE_MACHINE_1_IHSET042       sr/id/id_s4/CurrentH
+GET FRONTEND_MACHINE_MACHINE_1_IVSET042       sr/id/id_s4/CurrentV
+GET FRONTEND_MACHINE_MACHINE_1_IVSTAT042      sr/id/id_s4/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_IHSTAT042      sr/id/id_s4/StatRF
+GET PSEWH_S4_CURSET_RR                     sr/id/id_s4/CurrentH
+GET PSEWV_S4_CURSET_RR                     sr/id/id_s4/CurrentV
+GET PSEWV_S4_STAT_RF                       sr/id/id_s4/StatRF
+GET PSEWH_S4_STAT_RF                       sr/id/id_s4/StatRF
+
+#id4 settings
+SET FRONTEND_MACHINE_MACHINE_1_IHSET042  GAP040 sr/id/id_s4/CurrentH
+SET FRONTEND_MACHINE_MACHINE_1_IVSET042  GAP041 sr/id/id_s4/CurrentV
+
+#ID5 readings
+GET 052F_MACHINE_MACHINE_1_GAP051       sr/id/id_s5/Gap1
+GET 052F_MACHINE_MACHINE_1_GAP052       sr/id/id_s5/Gap2
+GET 052F_MACHINE_MACHINE_1_GAP053       sr/id/id_s5/Gap3
+GET 052F_MACHINE_MACHINE_1_GAPS050      sr/id/id_s5/StatRF
+
+#ID6 readings
+GET 062F_MACHINE_MACHINE_1_GAP061       sr/id/id_s6/Gap1
+GET 062F_MACHINE_MACHINE_1_GAP062       sr/id/id_s6/Gap2
+GET 062F_MACHINE_MACHINE_1_GAP063       sr/id/id_s6/Gap3
+GET 062F_MACHINE_MACHINE_1_GAPS060      sr/id/id_s6/StatRF
+
+#ID6 settings
+SET 062F_MACHINE_MACHINE_1_GAP061    GAP061 sr/id/id_s6/Gap1
+SET 062F_MACHINE_MACHINE_1_GAP062    GAP062 sr/id/id_s6/Gap2
+SET 062F_MACHINE_MACHINE_1_GAP063    GAP063 sr/id/id_s6/Gap3
+SET 062F_MACHINE_MACHINE_1_GAP060    VALUE sr/id/id_s6/Gapall
+
+#ID7 readings
+GET 072F_MACHINE_MACHINE_1_POS072       blproxy/id/id_s7/UserPosition
+GET 072F_MACHINE_MACHINE_1_STAT070      blproxy/id/id_s7/StatRF
+
+#ID7 settings
+SET 072F_MACHINE_MACHINE_1_POS072    VALUE blproxy/id/id_s7/UserPosition
+
+#ID8 readings
+GET FRONTEND_MACHINE_MACHINE_1_GAP081       sr/id/id_s8.1/Gap
+GET FRONTEND_MACHINE_MACHINE_1_GAP082       sr/id/id_s8.2/Gap
+GET FRONTEND_MACHINE_MACHINE_1_TAP081       sr/id/id_s8.1/Taper
+GET FRONTEND_MACHINE_MACHINE_1_TAP082       sr/id/id_s8.2/Taper
+GET FRONTEND_MACHINE_MACHINE_1_PHA081       sr/id/id_s8.1/Phase
+GET FRONTEND_MACHINE_MACHINE_1_PHA082       sr/id/id_s8.2/Phase
+GET FRONTEND_MACHINE_MACHINE_1_GAPS081      sr/id/id_s8.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_GAPS082      sr/id/id_s8.2/StatRF
+
+#ID8 settings
+SET FRONTEND_MACHINE_MACHINE_1_GAP081 GAP081 sr/id/id_s8.1/Gap
+SET FRONTEND_MACHINE_MACHINE_1_GAP082 GAP082 sr/id/id_s8.2/Gap
+SET FRONTEND_MACHINE_MACHINE_1_TAP081 TAP081 sr/id/id_s8.1/Taper
+SET FRONTEND_MACHINE_MACHINE_1_TAP082 TAP082 sr/id/id_s8.2/Taper
+SET FRONTEND_MACHINE_MACHINE_1_PHA081 PHA081 sr/id/id_s8.1/Phase
+SET FRONTEND_MACHINE_MACHINE_1_PHA082 PHA082 sr/id/id_s8.2/Phase
+
+
+#ID9 readings
+GET FRONTEND_MACHINE_MACHINE_1_GAP091       sr/id/id_s9.1/Gap
+GET FRONTEND_MACHINE_MACHINE_1_GAP092       sr/id/id_s9.2/Gap
+GET FRONTEND_MACHINE_MACHINE_1_TAP091       sr/id/id_s9.1/Taper
+GET FRONTEND_MACHINE_MACHINE_1_TAP092       sr/id/id_s9.2/Taper
+GET FRONTEND_MACHINE_MACHINE_1_PHA091       sr/id/id_s9.1/Phase
+GET FRONTEND_MACHINE_MACHINE_1_PHA092       sr/id/id_s9.2/Phase
+GET FRONTEND_MACHINE_MACHINE_1_GAPS091      sr/id/id_s9.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_GAPS092      sr/id/id_s9.2/StatRF
+
+#ID9 settings
+SET FRONTEND_MACHINE_MACHINE_1_GAP091 GAP091 sr/id/id_s9.1/Gap
+SET FRONTEND_MACHINE_MACHINE_1_GAP092 GAP092 sr/id/id_s9.2/Gap
+SET FRONTEND_MACHINE_MACHINE_1_TAP091 TAP091 sr/id/id_s9.1/Taper
+SET FRONTEND_MACHINE_MACHINE_1_TAP092 TAP092 sr/id/id_s9.2/Taper
+SET FRONTEND_MACHINE_MACHINE_1_PHA091 PHA091 sr/id/id_s9.1/Phase
+SET FRONTEND_MACHINE_MACHINE_1_PHA092 PHA092 sr/id/id_s9.2/Phase
+
+#ID10 readings
+GET FRONTEND_MACHINE_MACHINE_1_GAP101   sr/id/id_s10.1/Gap1
+GET FRONTEND_MACHINE_MACHINE_1_GAP102   sr/id/id_s10.2/Gap1
+GET FRONTEND_MACHINE_MACHINE_1_GAPS101  sr/id/id_s10.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_GAPS102  sr/id/id_s10.2/StatRF
+#ID10 settings
+SET FRONTEND_MACHINE_MACHINE_1_GAP101   VALGAP sr/id/id_s10.1/Gap1
+SET FRONTEND_MACHINE_MACHINE_1_GAP102   VALGAP sr/id/id_s10.2/Gap1
+
+#ID12 twin apu  readings
+GET FRONTEND_MACHINE_MACHINE_1_HIGHENPOS  sr/id/id_s12.01/UserPositionHigh
+GET FRONTEND_MACHINE_MACHINE_1_LOWENPOS  sr/id/id_s12.01/UserPositionLow
+GET FRONTEND_MACHINE_MACHINE_1_LOWEN011   sr/id/id_s12.01/LowEnergy
+GET FRONTEND_MACHINE_MACHINE_1_HIGHEN011  sr/id/id_s12.01/HighEnergy
+GET FRONTEND_MACHINE_MACHINE_1_GAPS010     sr/id/id_s12.01/StatRF
+
+#ID12 twin apu settings
+SET FRONTEND_MACHINE_MACHINE_1_LOWENPOS   LOWENPOS sr/id/id_s12.01/UserPositionLow
+SET FRONTEND_MACHINE_MACHINE_1_HIGHENPOS  HIGHENPOS sr/id/id_s12.01/UserPositionHigh
diff --git a/TCPSserver/elettrabcsbridge011.cfg b/TCPSserver/elettrabcsbridge011.cfg
new file mode 100644
index 0000000..4b9694e
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge011.cfg
@@ -0,0 +1,49 @@
+#configuration  file for elettra-Tango  to BCS bridge
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+GET FRONTEND_MACHINE_MACHINE_1_P120S011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s01.03/Pressure
+
+GET FRONTEND_MACHINE_MACHINE_1_P400S011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s01.01/Pressure
+
+#front-end VLVFE readings
+GET FRONTEND_MACHINE_MACHINE_1_VALVE011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s1.1m/StatRF
+
+#front-end PHOTON SHUTTER readings
+GET FRONTEND_MACHINE_MACHINE_1_SHUT011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.1m/StatRF
+
+GET 011F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_SS1
+
+GET 011F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_SS1
+
+GET 011F_MACHINE_MACHINE_1_XANGL  sr/diagnostics/bpmid/XP_SS1
+
+GET 011F_MACHINE_MACHINE_1_YANGL  sr/diagnostics/bpmid/YP_SS1
+
+#ID12 twin apu  readings
+GET FRONTEND_MACHINE_MACHINE_1_HIGHENPOS  sr/id/id_s12.01/UserPositionHigh
+
+GET FRONTEND_MACHINE_MACHINE_1_LOWENPOS  sr/id/id_s12.01/UserPositionLow
+
+GET FRONTEND_MACHINE_MACHINE_1_LOWEN011   sr/id/id_s12.01/LowEnergy
+
+GET FRONTEND_MACHINE_MACHINE_1_HIGHEN011  sr/id/id_s12.01/HighEnergy
+
+GET FRONTEND_MACHINE_MACHINE_1_GAPS010     sr/id/id_s12.01/StatRF
+
+#ID12 twin apu settings
+SET FRONTEND_MACHINE_MACHINE_1_LOWENPOS   LOWENPOS sr/id/id_s12.01/UserPositionLow
+SET FRONTEND_MACHINE_MACHINE_1_HIGHENPOS  HIGHENPOS sr/id/id_s12.01/UserPositionHigh
diff --git a/TCPSserver/elettrabcsbridge011.cfg.old b/TCPSserver/elettrabcsbridge011.cfg.old
new file mode 100644
index 0000000..b4b4de6
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge011.cfg.old
@@ -0,0 +1,48 @@
+#configuration  file for elettra-Tango  to BCS bridge
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_USERBEAM tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+GET FRONTEND_MACHINE_MACHINE_1_P120S011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s01.03/Pressure
+
+GET FRONTEND_MACHINE_MACHINE_1_P400S011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s01.01/Pressure
+
+#front-end VLVFE readings
+GET FRONTEND_MACHINE_MACHINE_1_VALVE011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s1.1m/StatRF
+
+#front-end PHOTON SHUTTER readings
+GET FRONTEND_MACHINE_MACHINE_1_SHUT011 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.1m/StatRF
+
+GET 011F_MACHINE_MACHINE_1_XPOS011    sr/diagnostics/bpmid/X_S1
+
+GET 011F_MACHINE_MACHINE_1_YPOS011    sr/diagnostics/bpmid/Y_S1
+
+GET 011F_MACHINE_MACHINE_1_XANGL011  sr/diagnostics/bpmid/XP_S1
+
+GET 011F_MACHINE_MACHINE_1_YANGL011  sr/diagnostics/bpmid/YP_S1
+
+#ID12 twin apu  readings
+GET FRONTEND_MACHINE_MACHINE_1_HIGHENPOS  sr/id/id_s12.01/UserPositionHigh
+
+GET FRONTEND_MACHINE_MACHINE_1_LOWENPOS  sr/id/id_s12.01/UserPositionLow
+
+GET FRONTEND_MACHINE_MACHINE_1_LOWEN011   sr/id/id_s12.01/LowEnergy
+
+GET FRONTEND_MACHINE_MACHINE_1_HIGHEN011  sr/id/id_s12.01/HighEnergy
+
+GET FRONTEND_MACHINE_MACHINE_1_GAPS010     sr/id/id_s12.01/StatRF
+
+#ID12 twin apu settings
+SET FRONTEND_MACHINE_MACHINE_1_LOWENPOS   LOWENPOS sr/id/id_s12.01/UserPositionLow
diff --git a/TCPSserver/elettrabcsbridge012.cfg b/TCPSserver/elettrabcsbridge012.cfg
new file mode 100644
index 0000000..0adf607
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge012.cfg
@@ -0,0 +1,55 @@
+#configuration  file for elettra-Tango  to BCS bridge - FEL - Nanospectroscopy : 20012
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+
+GET FRONTEND_MACHINE_MACHINE_1_P120S012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s01.07/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s01.01/Pressure
+#questo puo' essere diffente dal vecchio SIP400_S1.2_PRES_RR che non esiet piu'
+
+
+#front-end VLVFE readings
+#GET FRONTEND_MACHINE_MACHINE_1_VALVE01M tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s1.1m/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_VALVE012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s1.2/StatRF
+
+#front-end PHOTON SHUTTER readings
+#GET FRONTEND_MACHINE_MACHINE_1_SHUT01M tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.1m/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT012 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s1.2/StatRF
+
+
+#beam positions and angles at centre of straigth sections
+GET 012F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S1
+GET 012F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S1
+GET 012F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S1
+GET 012F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S1
+
+#ID1 readings
+GET FRONTEND_MACHINE_MACHINE_1_GAP011       sr/id/id_s1.1/Gap
+GET FRONTEND_MACHINE_MACHINE_1_GAP012       sr/id/id_s1.2/Gap
+GET FRONTEND_MACHINE_MACHINE_1_PHA011       sr/id/id_s1.1/Phase
+GET FRONTEND_MACHINE_MACHINE_1_PHA012       sr/id/id_s1.2/Phase
+GET FRONTEND_MACHINE_MACHINE_1_GAPS011      sr/id/id_s1.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_GAPS012      sr/id/id_s1.2/StatRF
+
+#ID1 settings
+SET FRONTEND_MACHINE_MACHINE_1_GAP011 GAP011 sr/id/id_s1.1/Gap
+SET FRONTEND_MACHINE_MACHINE_1_GAP012 GAP012 sr/id/id_s1.2/Gap
+SET FRONTEND_MACHINE_MACHINE_1_PHA011 PHA011 sr/id/id_s1.1/Phase
+SET FRONTEND_MACHINE_MACHINE_1_PHA012 PHA012 sr/id/id_s1.2/Phase
+
+#PSMOD1 readings
+GET FRONTEND_MACHINE_MACHINE_1_IM012       sr/id/psmod_s1/Current
+GET FRONTEND_MACHINE_MACHINE_1_M012        sr/id/psmod_s1/StatRF
+
+#PSMOD1 settings
+SET FRONTEND_MACHINE_MACHINE_1_IM012 IM012 sr/id/psmod_s1/Current
diff --git a/TCPSserver/elettrabcsbridge022.cfg b/TCPSserver/elettrabcsbridge022.cfg
new file mode 100644
index 0000000..c46fa11
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge022.cfg
@@ -0,0 +1,45 @@
+#configuration  file for elettra-Tango  to BCS bridge 022 	SuperESCA - Escamicroscopy : 20022
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+
+GET 022F_MACHINE_MACHINE_1_P120S022     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s02.07/Pressure
+GET 022F_MACHINE_MACHINE_1_P400S022     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s02.02/Pressure
+
+#front-end VLVFE readings
+GET 022F_MACHINE_MACHINE_1_VALVE022     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s2.2/StatRF
+
+#front-end PHOTON SHUTTER readings
+GET 022F_MACHINE_MACHINE_1_SHUT022     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s2.2/StatRF
+
+
+#beam positions and angles at centre of straigth sections
+
+GET 022F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S2
+GET 022F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S2
+GET 022F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S2
+GET 022F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S2
+
+
+
+#beam positions and angles at short straight sections
+
+
+#ID2 readings
+GET 022F_MACHINE_MACHINE_1_GAP021       blproxy/id/id_s2/Gap
+GET 022F_MACHINE_MACHINE_1_TAP021       blproxy/id/id_s2/Tapering
+GET 022F_MACHINE_MACHINE_1_GAPS020      blproxy/id/id_s2/StatRF
+
+#ID2 settings
+SET 022F_MACHINE_MACHINE_1_GAP021    VALGAP blproxy/id/id_s2/Gap
+SET 022F_MACHINE_MACHINE_1_TAP021    VALGAP blproxy/id/id_s2/Tapering
diff --git a/TCPSserver/elettrabcsbridge032.cfg b/TCPSserver/elettrabcsbridge032.cfg
new file mode 100644
index 0000000..1bd2551
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge032.cfg
@@ -0,0 +1,45 @@
+#configuration  file for elettra-Tango  to BCS bridge 032 	VUV photoemission - Spectromicroscopy : 20032
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+
+GET 032F_MACHINE_MACHINE_1_P120S032     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s03.07/Pressure
+GET 032F_MACHINE_MACHINE_1_P400S032     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s03.02/Pressure
+
+#front-end VLVFE readings
+
+GET 032F_MACHINE_MACHINE_1_VALVE032     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s3.2/StatRF
+
+#front-end PHOTON SHUTTER readings
+
+GET 032F_MACHINE_MACHINE_1_SHUT032     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s3.2/StatRF
+
+
+#beam positions and angles at centre of straigth sections
+
+GET 032F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S3
+GET 032F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S3
+GET 032F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S3
+GET 032F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S3
+
+#ID3 readings
+GET 032F_MACHINE_MACHINE_1_GAP031       sr/id/id_s3/Gap1
+GET 032F_MACHINE_MACHINE_1_GAP032       sr/id/id_s3/Gap2
+GET 032F_MACHINE_MACHINE_1_GAP033       sr/id/id_s3/Gap3
+GET 032F_MACHINE_MACHINE_1_GAPS030      sr/id/id_s3/StatRF
+
+#ID3 settings
+SET 032F_MACHINE_MACHINE_1_GAP031    GAP031 sr/id/id_s3/Gap1
+SET 032F_MACHINE_MACHINE_1_GAP032    GAP032 sr/id/id_s3/Gap2
+SET 032F_MACHINE_MACHINE_1_GAP033    GAP033 sr/id/id_s3/Gap3
+SET 032F_MACHINE_MACHINE_1_GAP030    VALUE sr/id/id_s3/Gapall
diff --git a/TCPSserver/elettrabcsbridge042.cfg b/TCPSserver/elettrabcsbridge042.cfg
new file mode 100644
index 0000000..745fcce
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge042.cfg
@@ -0,0 +1,50 @@
+#configuration  file for elettra-Tango  to BCS bridge 042 	Circularly Polarized : 20042
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+
+GET FRONTEND_MACHINE_MACHINE_1_P120S042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s04.07/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s04.02/Pressure
+
+#front-end VLVFE readings
+GET FRONTEND_MACHINE_MACHINE_1_VALVE042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s4.2/StatRF
+
+#front-end PHOTON SHUTTER readings
+
+GET FRONTEND_MACHINE_MACHINE_1_SHUT042 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s4.2/StatRF
+
+#beam positions and angles at centre of straigth sections
+
+GET 042F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S4
+GET 042F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S4
+GET 042F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S4
+GET 042F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S4
+
+
+#ID4 readings
+GET FRONTEND_MACHINE_MACHINE_1_IH042       sr/id/id_s4/CurrentH
+GET FRONTEND_MACHINE_MACHINE_1_IV042       sr/id/id_s4/CurrentV
+GET FRONTEND_MACHINE_MACHINE_1_IHSET042    sr/id/id_s4/CurrentH
+GET FRONTEND_MACHINE_MACHINE_1_IVSET042    sr/id/id_s4/CurrentV
+GET FRONTEND_MACHINE_MACHINE_1_IVST042     sr/id/id_s4/FlagV
+GET FRONTEND_MACHINE_MACHINE_1_IHST042     sr/id/id_s4/FlagH
+GET PSEWH_S4_CURSET_RR                     sr/id/id_s4/CurrentH
+GET PSEWV_S4_CURSET_RR                     sr/id/id_s4/CurrentV
+GET PSEWV_S4_STAT_RF                       sr/id/id_s4/FlagV
+GET PSEWH_S4_STAT_RF                       sr/id/id_s4/FlagH
+
+#id4 settings
+SET FRONTEND_MACHINE_MACHINE_1_IH042  GAP040 sr/id/id_s4/CurrentH
+SET FRONTEND_MACHINE_MACHINE_1_IV042  GAP041 sr/id/id_s4/CurrentV
+SET FRONTEND_MACHINE_MACHINE_1_IHSET042  GAP040 sr/id/id_s4/CurrentH
+SET FRONTEND_MACHINE_MACHINE_1_IVSET042  GAP041 sr/id/id_s4/CurrentV
diff --git a/TCPSserver/elettrabcsbridge052.cfg b/TCPSserver/elettrabcsbridge052.cfg
new file mode 100644
index 0000000..eba374a
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge052.cfg
@@ -0,0 +1,40 @@
+#configuration  file for elettra-Tango  to BCS bridge 052 	X-ray diffraction - SAXS : 20052
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+
+
+GET 052F_MACHINE_MACHINE_1_P120S052     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S5.7_PRES_RR
+GET 052F_MACHINE_MACHINE_1_P400S052     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S5.2_PRES_RR
+
+
+
+#front-end VLVFE readings
+GET 052F_MACHINE_MACHINE_1_VALVE052     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S5.2_STAT_RF
+
+#front-end PHOTON SHUTTER readings
+GET 052F_MACHINE_MACHINE_1_SHUT052     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s5.2/StatRF
+
+#beam positions and angles at centre of straigth sections
+
+GET 052F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S5
+GET 052F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S5
+GET 052F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S5
+GET 052F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S5
+
+
+#ID5 readings
+GET 052F_MACHINE_MACHINE_1_GAP051       sr/id/id_s5/Gap1
+GET 052F_MACHINE_MACHINE_1_GAP052       sr/id/id_s5/Gap2
+GET 052F_MACHINE_MACHINE_1_GAP053       sr/id/id_s5/Gap3
+GET 052F_MACHINE_MACHINE_1_GAPS050      sr/id/id_s5/StatRF
diff --git a/TCPSserver/elettrabcsbridge061.cfg b/TCPSserver/elettrabcsbridge061.cfg
new file mode 100644
index 0000000..ee401ee
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge061.cfg
@@ -0,0 +1,31 @@
+#configuration  file for elettra-Tango  to BCS bridge
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+GET 061F_MACHINE_MACHINE_1_P120S061     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S6.3_PRES_RR
+GET 061F_MACHINE_MACHINE_1_P400S061     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S6.1_PRES_RR
+
+#front-end VLVFE readings
+GET 061F_MACHINE_MACHINE_1_VALVE061     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S6.1_STAT_RF
+
+#front-end PHOTON SHUTTER readings
+
+GET 061F_MACHINE_MACHINE_1_SHUT061     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s6.1/StatRF
+
+
+#beam positions and angles at exit  of bending magnets
+
+GET 061F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B6
+GET 061F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B6
+GET 061F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B6
+GET 061F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B6
diff --git a/TCPSserver/elettrabcsbridge062.cfg b/TCPSserver/elettrabcsbridge062.cfg
new file mode 100644
index 0000000..5e8c3a2
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge062.cfg
@@ -0,0 +1,41 @@
+#configuration  file for elettra-Tango  to BCS bridge 062 	Gas Phase : 20062
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+GET 062F_MACHINE_MACHINE_1_P120S062     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S6.7_PRES_RR
+GET 062F_MACHINE_MACHINE_1_P400S062     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S6.2_PRES_RR
+
+#front-end VLVFE readings
+GET 062F_MACHINE_MACHINE_1_VALVE062     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S6.2_STAT_RF
+
+#front-end PHOTON SHUTTER readings
+GET 062F_MACHINE_MACHINE_1_SHUT062     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s6.2/StatRF
+
+#beam positions and angles at centre of straigth sections
+
+GET 062F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S6
+GET 062F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S6
+GET 062F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S6
+GET 062F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S6
+
+#ID6 readings
+GET 062F_MACHINE_MACHINE_1_GAP061       sr/id/id_s6/Gap1
+GET 062F_MACHINE_MACHINE_1_GAP062       sr/id/id_s6/Gap2
+GET 062F_MACHINE_MACHINE_1_GAP063       sr/id/id_s6/Gap3
+GET 062F_MACHINE_MACHINE_1_GAPS060      sr/id/id_s6/StatRF
+
+#ID6 settings
+SET 062F_MACHINE_MACHINE_1_GAP061    GAP061 sr/id/id_s6/Gap1
+SET 062F_MACHINE_MACHINE_1_GAP062    GAP062 sr/id/id_s6/Gap2
+SET 062F_MACHINE_MACHINE_1_GAP063    GAP063 sr/id/id_s6/Gap3
+SET 062F_MACHINE_MACHINE_1_GAP060    VALUE sr/id/id_s6/Gapall
diff --git a/TCPSserver/elettrabcsbridge071.cfg b/TCPSserver/elettrabcsbridge071.cfg
new file mode 100644
index 0000000..99fb1be
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge071.cfg
@@ -0,0 +1,30 @@
+#configuration  file for elettra-Tango  to BCS bridge
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+GET FRONTEND_MACHINE_MACHINE_1_P120S071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S7.3_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P400S071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S7.1_PRES_RR
+
+#front-end VLVFE readings
+
+GET FRONTEND_MACHINE_MACHINE_1_VALVE071 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S7.1_STAT_RF
+
+#front-end PHOTON SHUTTER readings
+GET FRONTEND_MACHINE_MACHINE_1_SHUT071 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s7.1/StatRF
+
+#beam positions and angles at exit  of bending magnets
+
+GET 071F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B7
+GET 071F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B7
+GET 071F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B7
+GET 071F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B7
diff --git a/TCPSserver/elettrabcsbridge072.cfg b/TCPSserver/elettrabcsbridge072.cfg
new file mode 100644
index 0000000..3d9d4aa
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge072.cfg
@@ -0,0 +1,39 @@
+#configuration  file for elettra-Tango  to BCS bridge 072 	ALOISA : 20072
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+
+GET 072F_MACHINE_MACHINE_1_P120S072     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S7.7_PRES_RR
+GET 072F_MACHINE_MACHINE_1_P400S072     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S7.2_PRES_RR
+
+#front-end VLVFE readings
+
+GET 072F_MACHINE_MACHINE_1_VALVE072     tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S7.2_STAT_RF
+
+#front-end PHOTON SHUTTER readings
+
+GET 072F_MACHINE_MACHINE_1_SHUT072     tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s7.2/StatRF
+
+#beam positions and angles at centre of straigth sections
+
+GET 072F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S7
+GET 072F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S7
+GET 072F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S7
+GET 072F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S7
+
+#ID7 readings
+GET 072F_MACHINE_MACHINE_1_POS072       blproxy/id/id_s7/UserPosition
+GET 072F_MACHINE_MACHINE_1_STAT070      blproxy/id/id_s7/StatRF
+
+#ID7 settings
+SET 072F_MACHINE_MACHINE_1_POS072    VALUE blproxy/id/id_s7/UserPosition
diff --git a/TCPSserver/elettrabcsbridge081.cfg b/TCPSserver/elettrabcsbridge081.cfg
new file mode 100644
index 0000000..a3f01c3
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge081.cfg
@@ -0,0 +1,33 @@
+#configuration  file for elettra-Tango  to BCS bridge
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+GET FRONTEND_MACHINE_MACHINE_1_P120S081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S8.3_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P400S081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S8.1_PRES_RR
+
+
+#front-end VLVFE readings
+
+GET FRONTEND_MACHINE_MACHINE_1_VALVE081 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S8.1_STAT_RF
+
+
+#front-end PHOTON SHUTTER readings
+
+GET FRONTEND_MACHINE_MACHINE_1_SHUT081 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s8.1/StatRF
+
+#beam positions and angles at centre bending
+
+GET 081F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B8
+GET 081F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B8
+GET 081F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B8
+GET 081F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B8
diff --git a/TCPSserver/elettrabcsbridge082.cfg b/TCPSserver/elettrabcsbridge082.cfg
new file mode 100644
index 0000000..16e4c03
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge082.cfg
@@ -0,0 +1,53 @@
+#configuration  file for elettra-Tango  to BCS bridge 082 	Bach : 20082
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+
+#vacuum redings SIP120-SIP400
+GET FRONTEND_MACHINE_MACHINE_1_P120S082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S8.7_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P400S082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S8.2_PRES_RR
+
+#front-end VLVFE readings
+GET FRONTEND_MACHINE_MACHINE_1_VALVE082 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S8.2_STAT_RF
+
+#front-end PHOTON SHUTTER readings
+
+GET FRONTEND_MACHINE_MACHINE_1_SHUT082 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s8.2/StatRF
+
+
+#beam positions and angles at centre of straigth sections
+
+
+GET 082F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S8
+GET 082F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S8
+GET 082F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S8
+GET 082F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S8
+
+#ID8 readings
+GET FRONTEND_MACHINE_MACHINE_1_GAP081       sr/id/id_s8.1/Gap
+GET FRONTEND_MACHINE_MACHINE_1_GAP082       sr/id/id_s8.2/Gap
+GET FRONTEND_MACHINE_MACHINE_1_TAP081       sr/id/id_s8.1/Taper
+GET FRONTEND_MACHINE_MACHINE_1_TAP082       sr/id/id_s8.2/Taper
+GET FRONTEND_MACHINE_MACHINE_1_PHA081       sr/id/id_s8.1/Phase
+GET FRONTEND_MACHINE_MACHINE_1_PHA082       sr/id/id_s8.2/Phase
+GET FRONTEND_MACHINE_MACHINE_1_GAPS081      sr/id/id_s8.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_GAPS082      sr/id/id_s8.2/StatRF
+
+#ID8 settings
+SET FRONTEND_MACHINE_MACHINE_1_GAP081 GAP081 sr/id/id_s8.1/Gap
+SET FRONTEND_MACHINE_MACHINE_1_GAP082 GAP082 sr/id/id_s8.2/Gap
+SET FRONTEND_MACHINE_MACHINE_1_TAP081 TAP081 sr/id/id_s8.1/Taper
+SET FRONTEND_MACHINE_MACHINE_1_TAP082 TAP082 sr/id/id_s8.2/Taper
+SET FRONTEND_MACHINE_MACHINE_1_PHA081 PHA081 sr/id/id_s8.1/Phase
+SET FRONTEND_MACHINE_MACHINE_1_PHA082 PHA082 sr/id/id_s8.2/Phase
+SET FRONTEND_MACHINE_MACHINE_1_BRK081 BRKON sr/id/id_s8.1/Brake
+SET FRONTEND_MACHINE_MACHINE_1_BRK082 BRKON sr/id/id_s8.2/Brake
diff --git a/TCPSserver/elettrabcsbridge091.cfg b/TCPSserver/elettrabcsbridge091.cfg
new file mode 100644
index 0000000..1dc3c10
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge091.cfg
@@ -0,0 +1,30 @@
+#configuration  file for elettra-Tango  to BCS bridge
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+
+GET FRONTEND_MACHINE_MACHINE_1_P120S091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S9.2_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P400S091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S9.1_PRES_RR
+
+#front-end VLVFE readings
+GET FRONTEND_MACHINE_MACHINE_1_VALVE091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S9.1_STAT_RF
+
+#front-end PHOTON SHUTTER readings
+
+GET FRONTEND_MACHINE_MACHINE_1_SHUT091 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s9.1/StatRF
+
+#beam positions and angles at centre of straigth sections
+GET 091F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B9
+GET 091F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B9
+GET 091F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B9
+GET 091F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B9
diff --git a/TCPSserver/elettrabcsbridge092.cfg b/TCPSserver/elettrabcsbridge092.cfg
new file mode 100644
index 0000000..775e1b4
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge092.cfg
@@ -0,0 +1,53 @@
+#configuration  file for elettra-Tango  to BCS bridge 092 	APE : 20092
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+
+GET FRONTEND_MACHINE_MACHINE_1_P120S092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s09.07/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s09.02/Pressure
+
+
+#front-end VLVFE readings
+GET FRONTEND_MACHINE_MACHINE_1_VALVE092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s9.2/StatRF
+
+#front-end PHOTON SHUTTER readings
+GET FRONTEND_MACHINE_MACHINE_1_SHUT092 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s9.2/StatRF
+
+
+#beam positions and angles at centre of straigth sections
+
+
+GET 092F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S9
+GET 092F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S9
+GET 092F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S9
+GET 092F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S9
+
+#ID9 readings
+GET FRONTEND_MACHINE_MACHINE_1_GAP091       sr/id/id_s9.1/Gap
+GET FRONTEND_MACHINE_MACHINE_1_GAP092       sr/id/id_s9.2/Gap
+GET FRONTEND_MACHINE_MACHINE_1_TAP091       sr/id/id_s9.1/Taper
+GET FRONTEND_MACHINE_MACHINE_1_TAP092       sr/id/id_s9.2/Taper
+GET FRONTEND_MACHINE_MACHINE_1_PHA091       sr/id/id_s9.1/Phase
+GET FRONTEND_MACHINE_MACHINE_1_PHA092       sr/id/id_s9.2/Phase
+GET FRONTEND_MACHINE_MACHINE_1_GAPS091      sr/id/id_s9.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_GAPS092      sr/id/id_s9.2/StatRF
+
+#ID9 settings
+SET FRONTEND_MACHINE_MACHINE_1_GAP091 GAP091 sr/id/id_s9.1/Gap
+SET FRONTEND_MACHINE_MACHINE_1_GAP092 GAP092 sr/id/id_s9.2/Gap
+SET FRONTEND_MACHINE_MACHINE_1_TAP091 TAP091 sr/id/id_s9.1/Taper
+SET FRONTEND_MACHINE_MACHINE_1_TAP092 TAP092 sr/id/id_s9.2/Taper
+SET FRONTEND_MACHINE_MACHINE_1_PHA091 PHA091 sr/id/id_s9.1/Phase
+SET FRONTEND_MACHINE_MACHINE_1_PHA092 PHA092 sr/id/id_s9.2/Phase
+SET FRONTEND_MACHINE_MACHINE_1_BRK091 BRKON sr/id/id_s9.1/Brake
+SET FRONTEND_MACHINE_MACHINE_1_BRK092 BRKON sr/id/id_s9.2/Brake
diff --git a/TCPSserver/elettrabcsbridge101.cfg b/TCPSserver/elettrabcsbridge101.cfg
new file mode 100644
index 0000000..a309597
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge101.cfg
@@ -0,0 +1,32 @@
+#configuration  file for elettra-Tango  to BCS bridge
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+
+GET FRONTEND_MACHINE_MACHINE_1_P120S101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s10.03/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s10.01/Pressure
+
+#front-end VLVFE readings
+GET FRONTEND_MACHINE_MACHINE_1_VALVE101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s10.1/StatRF
+
+
+#front-end PHOTON SHUTTER readings
+GET FRONTEND_MACHINE_MACHINE_1_SHUT101 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s10.1/StatRF
+
+#beam positions and angles at exit  of bending magnets
+
+
+GET 101F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B10
+GET 101F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B10
+GET 101F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B10
+GET 101F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B10
diff --git a/TCPSserver/elettrabcsbridge102.cfg b/TCPSserver/elettrabcsbridge102.cfg
new file mode 100644
index 0000000..e25277d
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge102.cfg
@@ -0,0 +1,48 @@
+#configuration  file for elettra-Tango  to BCS bridge 102 	Iuvs BaDElph: 20102
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+GET FRONTEND_MACHINE_MACHINE_1_P120S102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s10.07/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s10.02/Pressure
+
+#front-end VLVFE readings
+
+GET FRONTEND_MACHINE_MACHINE_1_VALVE102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s10.2/StatRF
+
+#front-end PHOTON SHUTTER readings
+GET FRONTEND_MACHINE_MACHINE_1_SHUT102 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s10.2/StatRF
+
+#beam positions and angles at centre of straigth sections
+
+
+GET 102F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S10
+GET 102F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S10
+GET 102F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S10
+GET 102F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S10
+
+
+
+#ID10 readings
+GET FRONTEND_MACHINE_MACHINE_1_GAP101   sr/id/id_s10.1/Gap1
+GET FRONTEND_MACHINE_MACHINE_1_GAP102   sr/id/id_s10.2/Gap1
+GET FRONTEND_MACHINE_MACHINE_1_GAPS101  sr/id/id_s10.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_GAPS102  sr/id/id_s10.2/StatRF
+#ID10 settings
+SET FRONTEND_MACHINE_MACHINE_1_GAP101   VALGAP sr/id/id_s10.1/Gap1
+SET FRONTEND_MACHINE_MACHINE_1_GAP102   VALGAP sr/id/id_s10.2/Gap1
+
+#ID10 collective readings
+GET FRONTEND_MACHINE_MACHINE_1_GAP100   sr/id/id_s10/Gap
+GET FRONTEND_MACHINE_MACHINE_1_GAPS100  sr/id/id_s10/StatRF
+#ID10 collective settings
+SET FRONTEND_MACHINE_MACHINE_1_GAP100   VALGAP sr/id/id_s10/Gap
diff --git a/TCPSserver/elettrabcsbridge111.cfg b/TCPSserver/elettrabcsbridge111.cfg
new file mode 100644
index 0000000..d2311fd
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge111.cfg
@@ -0,0 +1,29 @@
+#configuration  file for elettra-Tango  to BCS bridge
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+##vacuum redings SIP120-SIP400
+
+GET FRONTEND_MACHINE_MACHINE_1_P120S111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s11.03/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s11.01/Pressure
+
+#front-end VLVFE readings
+GET FRONTEND_MACHINE_MACHINE_1_VALVE111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s11.2/StatRF
+
+#front-end PHOTON SHUTTER readings
+GET FRONTEND_MACHINE_MACHINE_1_SHUT111 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s11.1/StatRF
+
+#beam positions and angles at exit  of bending magnets
+GET 111F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B11
+GET 111F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B11
+GET 111F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B11
+GET 111F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B11
diff --git a/TCPSserver/elettrabcsbridge112.cfg b/TCPSserver/elettrabcsbridge112.cfg
new file mode 100644
index 0000000..12226d1
--- /dev/null
+++ b/TCPSserver/elettrabcsbridge112.cfg
@@ -0,0 +1,36 @@
+#configuration  file for elettra-Tango  to BCS bridge 112 (SCW) 	 : 20112
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA tango://ecsproxy:11111/info/sr/1#dbase=no/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON tango://ecsproxy:11111/info/sr/1#dbase=no/beamON
+
+#vacuum redings SIP120-SIP400
+GET FRONTEND_MACHINE_MACHINE_1_P120S112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip120_s11.07/Pressure
+GET FRONTEND_MACHINE_MACHINE_1_P400S112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/sip400_s11.02/Pressure
+
+#front-end VLVFE readings
+GET FRONTEND_MACHINE_MACHINE_1_VALVE112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/vlvfe_s12.2/StatRF
+
+#front-end PHOTON SHUTTER readings
+
+GET FRONTEND_MACHINE_MACHINE_1_SHUT112 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s11.2/StatRF
+
+
+#beam positions and angles at centre of straigth sections
+
+
+GET 112F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_S11
+GET 112F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_S11
+GET 112F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_S11
+GET 112F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_S11
+
+#SCW reading
+GET FRONTEND_MACHINE_MACHINE_1_SCWFIELD  sr/scw/scw_a11.1/MagneticField
+GET FRONTEND_MACHINE_MACHINE_1_SCWSTATE  sr/scw/scw_a11.1/State
diff --git a/TCPSserver/list-active.txt b/TCPSserver/list-active.txt
new file mode 100644
index 0000000..d985964
--- /dev/null
+++ b/TCPSserver/list-active.txt
@@ -0,0 +1,36 @@
+1.1: PS120S01_M, PS400S11, VALVE01M SHUT01M XANGL011,XPOS011,YANGL011 YPOS011
+
+1.2 (012) P120S012, PS400S012 SHUT012 VALVE012 XANGL012,XPOS012,YANGL012 YPOS012
+
+2.2 (022) PS120S022 PS400S022 SHUT022 VALVE022 XANGL022,XPOS022,YANGL022 YPOS022
+
+3.2 (032) PS120S032 PS400S032 SHUT032 VALVE032 XANGL032,XPOS032,YANGL032 YPOS032
+
+4.2 (042) PS120S042 PS400S042 SHUT042 VALVE042 XANGL042,XPOS042,YANGL032 YPOS042
+
+5.2 (052) PS120S042 PS400S052 SHUT052 VALVE052 XANGL052,XPOS052,YANGL032 YPOS052
+
+6.1 (061) PS120S061 PS400S061 SHUT061 VALVE061 XANGL061,XPOS061,YANGL061 YPOS061
+
+6.2 (062) PS120S062 PS400S062 SHUT062 VALVE062 XANGL062,XPOS062,YANGL062 YPOS062
+
+7.1 (071) PS120S071 PS400S071 SHUT071 VALVE071 XANGL071,XPOS071,YANGL071 YPOS071
+
+7.2 (072) PS120S072 PS400S072 SHUT072 VALVE072 XANGL072,XPOS072,YANGL072 YPOS072
+
+8.1 (081) PS120S081 PS400S081 SHUT081 VALVE081 XANGL081,XPOS081,YANGL081 YPOS081
+
+8.2 (082) PS120S082 PS400S082 SHUT082 VALVE082 XANGL082,XPOS082,YANGL082 YPOS082
+
+9.1 (091) PS120S091 PS400S091 SHUT091 VALVE091 XANGL091,XPOS091,YANGL091 YPOS091
+
+9.2 (092) PS120S092 PS400S092 SHUT092 VALVE092 XANGL092,XPOS092,YANGL092 YPOS092
+
+10.1 (101) PS120S101 PS400S101 SHUT101 VALVE101 XANGL101,XPOS101,YANGL101 YPOS101
+
+10.2 (102) PS120S102 PS400S102 SHUT102 VALVE102 XANGL102,XPOS102,YANGL102 YPOS102
+
+11.1 (111) PS120S111 PS400S111 SHUT111 VALVE111 XANGL111,XPOS111,YANGL111 YPOS111
+
+11.2 (112) PS120S112 PS400S112 SHUT112 VALVE112 XANGL112,XPOS112,YANGL112 YPOS112
+
diff --git a/TCPSserver/prova.sh b/TCPSserver/prova.sh
new file mode 100755
index 0000000..ddadca6
--- /dev/null
+++ b/TCPSserver/prova.sh
@@ -0,0 +1,9 @@
+INSTANCES="elettrabcsbridge012.cfg  elettrabcsbridge022.cfg elettrabcsbridge032.cfg elettrabcsbridge042.cfg elettrabcsbridge052.cfg elettrabcsbridge062.cfg  elettrabcsbridge072.cfg elettrabcsbridge082.cfg elettrabcsbridge092.cfg elettrabcsbridge102.cfg"
+PORTS=(20012 20022 20032 20042 20052 20062 02072 20082 20092 20102)
+index=0
+for inst in $INSTANCES
+do
+PORT=${PORTS[$index]}
+echo "$inst -f $PORT"
+index=$((index + 1))
+done
\ No newline at end of file
diff --git a/TCPSserver/tcps.sh b/TCPSserver/tcps.sh
new file mode 100755
index 0000000..27f5494
--- /dev/null
+++ b/TCPSserver/tcps.sh
@@ -0,0 +1,156 @@
+#!/bin/bash
+
+################################################################################
+# RP - 17 febbraio 2006
+# CS - 23 gennaio 2009
+# Codici di errore dello script
+# - in avvio:
+#   2: non c'e` l'eseguibile oppure i permessi non sono impostati correttamente
+#   3: il programma e` gia` in esecuzione
+#   4: non c'e` il file di configurazione /etc/default/elettra_daemons
+#   5: nel file di configurazione /etc/default/elettra_daemons non viene
+#      richiesto di avviare il programma
+#   6: errore nell'avvio del programma come root.
+#   7: errore nell'avvio del programma come servuser.
+#   8: e` stato utilizzato un utente sbagliato per eseguire lo script
+# - in arresto:
+#   50: il programma non e` in esecuzione
+#   51: si e` verificato un errore arrestando il programma. Viene fornito il
+#       codice di uscita del kill
+################################################################################
+PREFIX="/runtime/elettra/servers"
+CONFPREFIX="$PREFIX/etc"
+PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PREFIX/bin
+LD_LIBRARY_PATH=/usr/local/tango-7.2.6/lib:/usr/local/omniorb-4.1.4/lib
+export LD_LIBRARY_PATH PATH
+export TANGO_HOST=tom:20000
+
+PYTHONPATH=$PREFIX/bin
+export PYTHONPATH
+SERVER="$PREFIX/bin/TCPStwserver.py"
+
+INSTANCES="elettrabcsbridge012.cfg  elettrabcsbridge022.cfg elettrabcsbridge032.cfg elettrabcsbridge042.cfg elettrabcsbridge052.cfg elettrabcsbridge062.cfg  elettrabcsbridge072.cfg elettrabcsbridge082.cfg elettrabcsbridge092.cfg elettrabcsbridge102.cfg elettrabcsbridge011.cfg elettrabcsbridge061.cfg elettrabcsbridge071.cfg elettrabcsbridge081.cfg elettrabcsbridge101.cfg elettrabcsbridge111.cfg elettrabcsbridge091.cfg elettrabcsbridge112.cfg"
+
+PORTS=(20012 20022 20032 20042 20052 20062 20072 20082 20092 20102 20011 20061 20071 20081 20101 20111 20091 20112)
+
+LOGNAME="tcpserver"
+LOGBASE="/runtime/site/ecsproxy/log"
+LOGSIZE=1024k
+LOGLEVEL=info
+
+startserver()
+{
+if [ ! -x $SERVER ]; then
+	  echo " FAILED: $SERVER executable not found."
+	  exit 2
+fi
+index=0
+for INSTANCE in $INSTANCES
+do
+    PORT=${PORTS[$index]}
+    LOGFILE="$LOGBASE/$LOGNAME$PORT.log"
+    if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "1" ]
+  	then
+  	  echo "$SERVER -f $INSTANCE: already running."
+    else
+        echo -n "Starting $SERVER $INSTANCE  server ..."
+        if [ `id -u` -eq "0" ]
+        then
+            su - servuser -c "cd / && ulimit -c unlimited && $SERVER -f $CONFPREFIX/$INSTANCE -p $PORT -v $LOGLEVEL -l $LOGFILE &"
+            sleep 1
+            if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ]
+            then
+            echo " FAILED: an error occurred starting the program. Exit code: $?"
+            exit 6
+            else
+            echo " OK."
+            fi
+        else
+            if [ `id -u` -eq "10005" ]
+            then
+            cd / && ulimit -c unlimited && $SERVER -f $CONFPREFIX/$INSTANCE -p $PORT -v $LOGLEVEL -l $LOGFILE  &
+            sleep 1
+            if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ]
+            then
+                echo " FAILED: an error occurred starting the program. Exit code: $?"
+                exit 6
+            else
+                echo " OK."
+            fi
+            else
+            echo " FAILED: You must be root or servuser to run this script."
+            exit 8
+            fi  
+        fi
+     fi
+     index=$((index + 1))
+done
+}
+
+stopserver()
+{
+for INST in $INSTANCES
+do
+    PORT=${PORTS[$index]}
+    LOGFILE="$LOGBASE/$LOGFILE$PORT.log"
+    INSTANCE=$INST
+    echo -n "Stopping $SERVER $CONFPREFIX/$INSTANCE  server ..."
+	if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ]
+	then
+	  echo " FAILED: not running."
+	else
+	  kill `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | awk '{print $2}'`
+	  if [ $? != "0" ]
+	  then
+	    echo " FAILED stopping $SERVER -f $CONFPREFIX/$INSTANCE : an error occurred stopping the program. Exit code: $?"
+	  else
+	    echo " OK."
+	  fi
+        fi
+done
+}
+
+status()
+{
+for INSTANCE in $INSTANCES
+do
+    echo -n "checking $SERVER -f $CONFPREFIX/$INSTANCE  ..."
+	
+    if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ]
+    then
+        echo " NOT running."
+    fi
+    if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -gt "0" ]
+    then
+        echo " running."
+    fi
+done 
+}
+
+case "$1" in
+    start)
+	startserver
+    ;;
+
+    stop)
+	stopserver
+    ;;
+
+    status)
+	status
+    ;;
+
+    restart)
+	$0 stop
+	sleep 2
+	$0 start
+    ;;
+    
+    *)
+	echo "Usage: /etc/init.d/$0 {start|stop|status|restart}"
+    ;;
+esac
+
+exit 0
+
+# EOF
diff --git a/TCPSserver/tcps.sh.inst b/TCPSserver/tcps.sh.inst
new file mode 100755
index 0000000..f909233
--- /dev/null
+++ b/TCPSserver/tcps.sh.inst
@@ -0,0 +1,156 @@
+#!/bin/bash
+
+################################################################################
+# RP - 17 febbraio 2006
+# CS - 23 gennaio 2009
+# Codici di errore dello script
+# - in avvio:
+#   2: non c'e` l'eseguibile oppure i permessi non sono impostati correttamente
+#   3: il programma e` gia` in esecuzione
+#   4: non c'e` il file di configurazione /etc/default/elettra_daemons
+#   5: nel file di configurazione /etc/default/elettra_daemons non viene
+#      richiesto di avviare il programma
+#   6: errore nell'avvio del programma come root.
+#   7: errore nell'avvio del programma come servuser.
+#   8: e` stato utilizzato un utente sbagliato per eseguire lo script
+# - in arresto:
+#   50: il programma non e` in esecuzione
+#   51: si e` verificato un errore arrestando il programma. Viene fornito il
+#       codice di uscita del kill
+################################################################################
+PREFIX="/runtime/elettra/servers"
+CONFPREFIX="$PREFIX/etc"
+PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PREFIX/bin
+LD_LIBRARY_PATH=/usr/local/tango-7.2.6/lib:/usr/local/omniorb-4.1.4/lib
+export LD_LIBRARY_PATH PATH
+export TANGO_HOST=tom:20000
+
+PYTHONPATH=$PREFIX/bin
+export PYTHONPATH
+SERVER="$PREFIX/bin/TCPStwserver.py"
+
+INSTANCES="elettrabcsbridge012.cfg  elettrabcsbridge022.cfg elettrabcsbridge032.cfg elettrabcsbridge042.cfg elettrabcsbridge052.cfg elettrabcsbridge062.cfg  elettrabcsbridge072.cfg elettrabcsbridge082.cfg elettrabcsbridge092.cfg elettrabcsbridge102.cfg elettrabcsbridge011.cfg elettrabcsbridge061.cfg elettrabcsbridge081.cfg elettrabcsbridge101.cfg elettrabcsbridge111.cfg"
+
+PORTS=(20012 20022 20032 20042 20052 20062 02072 20082 20092 20102 20011 20061 20081 20101 20111)
+
+LOGNAME="tcpserver"
+LOGBASE="/runtime/site/ecsproxy/log"
+LOGSIZE=1024k
+LOGLEVEL=info
+
+startserver()
+{
+if [ ! -x $SERVER ]; then
+	  echo " FAILED: $SERVER executable not found."
+	  exit 2
+fi
+index=0
+for INSTANCE in $INSTANCES
+do
+    PORT=${PORTS[$index]}
+    LOGFILE="$LOGBASE/$LOGNAME$PORT.log"
+    if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "1" ]
+  	then
+  	  echo "$SERVER -f $INSTANCE: already running."
+    else
+        echo -n "Starting $SERVER $INSTANCE  server ..."
+        if [ `id -u` -eq "0" ]
+        then
+            su - servuser -c "cd / && ulimit -c unlimited && $SERVER -f $CONFPREFIX/$INSTANCE -p $PORT -v $LOGLEVEL -l $LOGFILE &"
+            sleep 1
+            if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ]
+            then
+            echo " FAILED: an error occurred starting the program. Exit code: $?"
+            exit 6
+            else
+            echo " OK."
+            fi
+        else
+            if [ `id -u` -eq "10005" ]
+            then
+            cd / && ulimit -c unlimited && $SERVER -f $CONFPREFIX/$INSTANCE -p $PORT -v $LOGLEVEL -l $LOGFILE  &
+            sleep 1
+            if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ]
+            then
+                echo " FAILED: an error occurred starting the program. Exit code: $?"
+                exit 6
+            else
+                echo " OK."
+            fi
+            else
+            echo " FAILED: You must be root or servuser to run this script."
+            exit 8
+            fi  
+        fi
+     fi
+     index=$((index + 1))
+done
+}
+
+stopserver()
+{
+for INST in $INSTANCES
+do
+    PORT=${PORTS[$index]}
+    LOGFILE="$LOGBASE/$LOGFILE$PORT.log"
+    INSTANCE=$INST
+    echo -n "Stopping $SERVER $CONFPREFIX/$INSTANCE  server ..."
+	if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ]
+	then
+	  echo " FAILED: not running."
+	else
+	  kill `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | awk '{print $2}'`
+	  if [ $? != "0" ]
+	  then
+	    echo " FAILED stopping $SERVER -f $CONFPREFIX/$INSTANCE : an error occurred stopping the program. Exit code: $?"
+	  else
+	    echo " OK."
+	  fi
+        fi
+done
+}
+
+status()
+{
+for INSTANCE in $INSTANCES
+do
+    echo -n "checking $SERVER -f $CONFPREFIX/$INSTANCE  ..."
+	
+    if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -eq "0" ]
+    then
+        echo " NOT running."
+    fi
+    if [ `ps -ef | grep "$SERVER -f $CONFPREFIX/$INSTANCE" | grep -v grep | wc -l` -gt "0" ]
+    then
+        echo " running."
+    fi
+done 
+}
+
+case "$1" in
+    start)
+	startserver
+    ;;
+
+    stop)
+	stopserver
+    ;;
+
+    status)
+	status
+    ;;
+
+    restart)
+	$0 stop
+	sleep 2
+	$0 start
+    ;;
+    
+    *)
+	echo "Usage: /etc/init.d/$0 {start|stop|status|restart}"
+    ;;
+esac
+
+exit 0
+
+# EOF
diff --git a/TCPSserver/tcpserver20012.log b/TCPSserver/tcpserver20012.log
new file mode 100644
index 0000000..e69de29
diff --git a/TCPSserver/testcmd.cfg b/TCPSserver/testcmd.cfg
new file mode 100644
index 0000000..2296e15
--- /dev/null
+++ b/TCPSserver/testcmd.cfg
@@ -0,0 +1,13 @@
+#configuration  file for elettra-Tango  to BCS bridge test simple commnds to fake ID
+
+#ID2 readings
+GET 022F_MACHINE_MACHINE_1_GAP021       sr/id/id_s2/Gap
+GET 022F_MACHINE_MACHINE_1_TAP021       sr/id/id_s2/Tapering
+
+#ID2 settings
+SET 022F_MACHINE_MACHINE_1_GAP021    VALGAP sr/id/id_s2/Gap
+SET 022F_MACHINE_MACHINE_1_TAP021    VALPHA sr/id/id_s2/Tapering
+
+#ID8 brakes
+GET 081F_MACHINE_MACHINE_1_BRK          sr/id/id_s8.1/Brake
+SET 081F_MACHINE_MACHINE_1_BRK    BRKON sr/id/id_s8.1/Brake
\ No newline at end of file
diff --git a/TCPSserver/testexc.py b/TCPSserver/testexc.py
new file mode 100644
index 0000000..75a7c0a
--- /dev/null
+++ b/TCPSserver/testexc.py
@@ -0,0 +1,19 @@
+import sys
+import string
+import PyTango
+
+dev=PyTango.DeviceProxy('sr/id/id_s2.2')
+
+try:
+    dev.write_attribute('Gap',22.5)
+except PyTango.DevFailed, e:
+    #exctype ,value = sys.exc_info()[:2]
+    #print 'Exception: ' , e
+    #for err in e:
+      #print ' reason', err.reason
+      #print ' description', err.desc
+      #print ' origin', err.origin
+      #print ' severity',err.severity
+    Err0=e[0].desc
+    Err1=e[1].desc
+    print 'ERRR', Err0, Err1.split()[5],
\ No newline at end of file
diff --git a/TCPSserver/testphbsh.cfg b/TCPSserver/testphbsh.cfg
new file mode 100644
index 0000000..39299db
--- /dev/null
+++ b/TCPSserver/testphbsh.cfg
@@ -0,0 +1,19 @@
+#front-end PHOTON SHUTTER readings
+GET FRONTEND_MACHINE_MACHINE_1_SHUT01M tango://tom:20000/sr/vacuum/phbsh_s1.1m/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT012 tango://tom:20000/sr/vacuum/phbsh_s1.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT101 tango://tom:20000/sr/vacuum/phbsh_s10.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT102 tango://tom:20000/sr/vacuum/phbsh_s10.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT111 tango://tom:20000/sr/vacuum/phbsh_s11.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT112 tango://tom:20000/sr/vacuum/phbsh_s11.2/StatRF
+GET 022F_MACHINE_MACHINE_1_SHUT022     tango://tom:20000/sr/vacuum/phbsh_s2.2/StatRF
+GET 032F_MACHINE_MACHINE_1_SHUT032     tango://tom:20000/sr/vacuum/phbsh_s3.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT042 tango://tom:20000/sr/vacuum/phbsh_s4.2/StatRF
+GET 052F_MACHINE_MACHINE_1_SHUT052     tango://tom:20000/sr/vacuum/phbsh_s5.2/StatRF
+GET 061F_MACHINE_MACHINE_1_SHUT061     tango://tom:20000/sr/vacuum/phbsh_s6.1/StatRF
+GET 062F_MACHINE_MACHINE_1_SHUT062     tango://tom:20000/sr/vacuum/phbsh_s6.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT071 tango://tom:20000/sr/vacuum/phbsh_s7.1/StatRF
+GET 072F_MACHINE_MACHINE_1_SHUT072     tango://tom:20000/sr/vacuum/phbsh_s7.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT081 tango://tom:20000/sr/vacuum/phbsh_s8.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT082 tango://tom:20000/sr/vacuum/phbsh_s8.2/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT091 tango://tom:20000/sr/vacuum/phbsh_s9.1/StatRF
+GET FRONTEND_MACHINE_MACHINE_1_SHUT092 tango://tom:20000/sr/vacuum/phbsh_s9.2/StatRF
\ No newline at end of file
diff --git a/TCPSserver/testsissi.cfg b/TCPSserver/testsissi.cfg
new file mode 100644
index 0000000..0cbe8cc
--- /dev/null
+++ b/TCPSserver/testsissi.cfg
@@ -0,0 +1,30 @@
+#configuration  file for elettra-Tango  to BCS bridge
+
+
+#main beam parameters
+GET FRONTEND_MACHINE_MACHINE_1_ACCUCURR tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Current
+GET FRONTEND_MACHINE_MACHINE_1_EENERGY tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Energy
+GET FRONTEND_MACHINE_MACHINE_1_LIFETIME tango://tom.ecs.elettra.trieste.it:20000/sr/diagnostics/dcct_s4/Lifetime
+
+#topup bits reading reading
+GET FRONTEND_MACHINE_MACHINE_1_TOPUSTA info/sr/1/Topupbits
+#BeamON reading
+GET FRONTEND_MACHINE_MACHINE_1_BEAMON info/sr/1/beamON
+
+#vacuum redings SIP120-SIP400
+
+GET FRONTEND_MACHINE_MACHINE_1_P120S091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip120/SIP120_S9.2_PRES_RR
+GET FRONTEND_MACHINE_MACHINE_1_P400S091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/sip400/SIP400_S9.1_PRES_RR
+
+#front-end VLVFE readings
+GET FRONTEND_MACHINE_MACHINE_1_VALVE091 tango://tom.ecs.elettra.trieste.it:20000/rpcbridge/rpc2tangobridge/vlvfe/VLVFE_S9.1_STAT_RF
+
+#front-end PHOTON SHUTTER readings
+
+GET FRONTEND_MACHINE_MACHINE_1_SHUT091 tango://tom.ecs.elettra.trieste.it:20000/sr/vacuum/phbsh_s9.1/StatRF
+
+#beam positions and angles at centre of straigth sections
+GET 091F_MACHINE_MACHINE_1_XPOS    sr/diagnostics/bpmid/X_B9
+GET 091F_MACHINE_MACHINE_1_YPOS    sr/diagnostics/bpmid/Y_B9
+GET 091F_MACHINE_MACHINE_1_XANGLE  sr/diagnostics/bpmid/XP_B9
+GET 091F_MACHINE_MACHINE_1_YANGLE  sr/diagnostics/bpmid/YP_B9
diff --git a/blfe.py b/blfe.py
new file mode 100644
index 0000000..476e957
--- /dev/null
+++ b/blfe.py
@@ -0,0 +1,209 @@
+# module for creating beamline front-end config
+# class blfe incapsulates the reading and closing of beamline front-ends shuter/stoppers
+# stores also the complet configuration
+# $Author: claudio $
+#
+# $Name:  $
+#
+# $Log: blfe.py,v $
+# Revision 1.15  2021-01-11 14:46:35  claudio
+# removed 061_BSTOPPERAF
+#
+# Revision 1.14  2018-04-30 08:36:29  claudio
+# #5959 errore closing front end
+#
+# Revision 1.13  2018-04-12 08:46:16  claudio
+# mod syrmep- verificate
+#
+# Revision 1.12  2018-04-03 08:42:34  claudio
+# #5643: modifiche syrmep
+#
+# Revision 1.11  2017-02-13 09:27:36  claudio
+# revision tag
+#
+# Revision 1.10  2016-03-21 08:54:23  claudio
+# tested commands for 112f
+#
+# Revision 1.9  2016-03-10 09:05:23  claudio
+# add 112 stopper
+#
+# Revision 1.8  2015-12-22 10:34:45  claudio
+# ticket 1591
+#
+# Revision 1.7  2014-09-29 09:08:53  claudio
+# correctc CMD and VAR for microfluo shopper
+#
+# Revision 1.6  2014-09-11 11:15:23  claudio
+# corrected label
+#
+# Revision 1.5  2014-09-10 12:16:13  claudio
+# ticket 1406: LEFT_SHUTTER_VACOWAGO_20
+#
+# Revision 1.4  2013-04-08 14:19:24  claudio
+# force case in string comparison
+#
+# Revision 1.3  2009/11/13 10:01:36  claudio
+# "natural" default rpc timeout
+#
+# Revision 1.2  2008/09/30 07:53:49  claudio
+# commented out shutter/stopper under commissioning (11.2)
+#
+# Revision 1.1  2008/09/23 09:12:10  claudio
+# First import
+#
+#
+import lib_pyElettra
+import string
+class blfe:
+    def __init__(self):
+        self.nread=0
+        self.nerror=0
+        self.nopen=0
+        self.nclosed=0
+        self.nunknown=0
+        self.nentries=0
+        
+        self.bltable=[]
+        #here put in the complete table of shopper/shutters/stoppers in beamline jargon
+        # format of table entry is:
+        # 'point','host','read-command_name',value,'status',set-command_name,set-parm
+        # value:0 closed, 1 open, -1 unknown, -2 read error'
+        # status: UNKNOWN,OPEN,CLOSED,ERROR
+        # value and status are dynamically changed by read operations
+        
+#		self.bltable.append(['BACKEND_SHOPPER_VACOBECK_20_STATUS0','bacs011.blcs.elettra.trieste.it','1.0-backend',-1,'UNKNOWN','BACKEND_SHOPPER_VACOBECK_20_RMTCMD0','RMTCMD0'])
+
+        self.bltable.append(['FRONTEND_SHOPPER-L_VACO_1_STATUS2','011f-bcs.blcs.elettra.trieste.it','1.1M TwinMic',-1,'UNKNOWN','FRONTEND_SHOPPER-L_VACO_1_RMTCMD2','VALRMTCMD2'])
+        
+        self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','012f-bcs.blcs.elettra.trieste.it','1.2 Nanospectr.',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' ])
+        self.bltable.append(['FRONTEND_SHUTTER_VACO_1_STATUS0','012f-bcs.blcs.elettra.trieste.it','1.2 Nanospectr.',-1,'UNKNOWN','FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' ])
+        
+        self.bltable.append(['022F_USTOPPER1F_VACO_1_STATUS1','022f-bcs.blcs.elettra.trieste.it','2.2 ESCA',-1,'UNKNOWN','022F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1'])
+        self.bltable.append(['022F_USHUTTER1F_VACO_1_STATUS0','022f-bcs.blcs.elettra.trieste.it','2.2 ESCA',-1,'UNKNOWN','022F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0' ])
+        
+        self.bltable.append(['032F_USTOPPER1F_VACO_1_STATUS1','032f-bcs.blcs.elettra.trieste.it','3.2 VUV/Spectrom.',-1,'UNKNOWN','032F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1'])
+        self.bltable.append(['032F_USHUTTER1F_VACO_1_STATUS0','032f-bcs.blcs.elettra.trieste.it','3.2 VUV/Spectrom.',-1,'UNKNOWN','032F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+        
+        self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','042f-bcs.blcs.elettra.trieste.it','4.2 Circ. pol.',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1'])
+        self.bltable.append(['FRONTEND_SHUTTER_VACO_1_STATUS0','042f-bcs.blcs.elettra.trieste.it','4.2 Circ. pol.',-1,'UNKNOWN','FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+        
+        self.bltable.append(['XRD_STOPPER1_VACO_11_STATUS0','052f-bcs.blcs.elettra.trieste.it','5.2 XRD1',-1,'UNKNOWN','XRD_STOPPER1_VACO_11_RMTCMD0' , 'VALRMTCMD0'])
+        self.bltable.append(['XRD_STOPPER2_VACO_10_STATUS3','052f-bcs.blcs.elettra.trieste.it','5.2 XRD1',-1,'UNKNOWN','XRD_STOPPER2_VACO_10_RMTCMD3' , 'VALRMTCMD3'])
+        self.bltable.append(['XRD_STOPPER3_VACO_10_STATUS2','052f-bcs.blcs.elettra.trieste.it','5.2 XRD1',-1,'UNKNOWN','XRD_STOPPER3_VACO_10_RMTCMD2' , 'VALRMTCMD2' ])
+        self.bltable.append(['052F_WSHUTTER1F_VACO_1_STATUS5','052f-bcs.blcs.elettra.trieste.it','5.2 SAXS',-1,'UNKNOWN','052F_WSHUTTER1F_VACO_1_RMTCMD5' , 'VALRMTCMD5'])
+        self.bltable.append(['052F_WSTOPPER1F_VACO_1_STATUS4','052f-bcs.blcs.elettra.trieste.it','5.2 SAXS',-1,'UNKNOWN','052F_WSTOPPER1F_VACO_1_RMTCMD4' , 'VALRMTCMD4'])
+        
+        self.bltable.append(['061F_BSTOPPERCF_VACO_1_STATUS2','061f-bcs.blcs.elettra.trieste.it','6.1 Mat. Science',-1,'UNKNOWN','061F_BSTOPPERCF_VACO_1_RMTCMD2' , 'VALRMTCMD2'])
+        self.bltable.append(['061F_BSHUTTERAF_VACO_2_STATUS0','061f-bcs.blcs.elettra.trieste.it','6.1 Syrmep',-1,'UNKNOWN','061F_BSHUTTERAF_VACO_2_RMTCMD0' , 'VALRMTCMD0'])
+        self.bltable.append(['061F_BSHUTTERCF_VACO_1_STATUS0','061f-bcs.blcs.elettra.trieste.it','6.1 Mat. Science',-1,'UNKNOWN','061F_BSHUTTERCF_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+        
+        self.bltable.append(['062F_USTOPPER1F_VACO_1_STATUS1','062f-bcs.blcs.elettra.trieste.it','6.2 GasPhase',-1,'UNKNOWN','062F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1'])
+        self.bltable.append(['062F_USHUTTER1F_VACO_1_STATUS0','062f-bcs.blcs.elettra.trieste.it','6.2 GasPhase',-1,'UNKNOWN','062F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+        
+        self.bltable.append(['FRONTEND_SHOPPER-R_VACO_1_STATUS0','071f-bcs.blcs.elettra.trieste.it','7.1 MCX',-1,'UNKNOWN','FRONTEND_SHOPPER-R_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+        self.bltable.append(['RIGHT_SHUTTER_VACO_30_STATUS4','071f-bcs.blcs.elettra.trieste.it','7.1 MCX',-1,'UNKNOWN','RIGHT_SHUTTER_VACO_30_RMTCMD4' , 'VALRMTCMD4'])
+        
+        self.bltable.append(['072F_USTOPPER1F_VACO_1_STATUS1','072f-bcs.blcs.elettra.trieste.it','7.2 ALOISA',-1,'UNKNOWN','072F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1'])
+        self.bltable.append(['072F_USHUTTER1F_VACO_1_STATUS0','072f-bcs.blcs.elettra.trieste.it','7.2 ALOISA',-1,'UNKNOWN','072F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+        
+        self.bltable.append(['FRONTEND_SHOPPER-R_VACO_2_STATUS0','081f-bcs.blcs.elettra.trieste.it','8.1 Lilit',-1,'UNKNOWN','FRONTEND_SHOPPER-R_VACO_2_RMTCMD0' , 'VALRMTCMD0'])
+        self.bltable.append(['FRONTEND_SHOPPER-L_VACO_1_STATUS0','081f-bcs.blcs.elettra.trieste.it','8.1 BEAR',-1,'UNKNOWN','FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+        self.bltable.append(['RIGHT_EXSLIT_VACO_10_STATUS4','081f-bcs.blcs.elettra.trieste.it','8.1 Lilit',-1,'UNKNOWN','RIGHT_EXSLIT_VACO_10_RMTCMD4' , 'VALRMTCMD4'])
+        
+        self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','082f-bcs.blcs.elettra.trieste.it','8.2 Bach',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1'])
+        self.bltable.append(['FRONTEND_SHUTTER_VACO_1_STATUS0','082f-bcs.blcs.elettra.trieste.it','8.2 Bach',-1,'UNKNOWN','FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+        
+        self.bltable.append(['CENTRAL_STOPPER_VACO_20_STATUS0','091f-bcs.blcs.elettra.trieste.it','9.1 SISSI',-1,'UNKNOWN','CENTRAL_STOPPER_VACO_20_RMTCMD0' , 'VALRMTCMD0'])
+        
+        self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','092f-bcs.blcs.elettra.trieste.it','9.2 APE',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1'])
+        self.bltable.append(['FRONTEND_SHUTTER_VACO_1_STATUS0','092f-bcs.blcs.elettra.trieste.it','9.2 APE',-1,'UNKNOWN','FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+        
+        self.bltable.append(['FRONTEND_SHOPPER-R_VACO_1_STATUS4','101f-bcs.blcs.elettra.trieste.it','10.1 DXRL',-1,'UNKNOWN','FRONTEND_SHOPPER-R_VACO_1_RMTCMD4' , 'VALRMTCMD4'])
+        self.bltable.append(['FRONTEND_SHOPPER-L_VACO_1_STATUS0','101f-bcs.blcs.elettra.trieste.it','10.1 X-Ray Fluo.',-1,'UNKNOWN','FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+        
+        self.bltable.append(['LEFT_SHUTTER_VACOWAGO_20_STATUS1','101f-bcs.blcs.elettra.trieste.it','10.1L X-Ray Fluo.',-1,'UNKNOWN','LEFT_SHUTTER_VACOWAGO_20_RMTCMD1' , 'RMTCMD1'])
+        
+        self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','102f-bcs.blcs.elettra.trieste.it','10.2 IUVS/BaDElPh',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1'])
+        self.bltable.append(['FRONTEND_SHUTTER_VACO_1_STATUS0','102f-bcs.blcs.elettra.trieste.it','10.2 IUVS/BaDElPh',-1,'UNKNOWN','FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+        
+        self.bltable.append(['FRONTEND_SHOPPER-R_VACO_2_STATUS0','111f-bcs.blcs.elettra.trieste.it','11.1 XAFS',-1,'UNKNOWN','FRONTEND_SHOPPER-R_VACO_2_RMTCMD0' , 'VALRMTCMD0'])
+        self.bltable.append(['RIGHT_STOPPER_VACO_30_STATUS6','111f-bcs.blcs.elettra.trieste.it','11.1 XAFS',-1,'UNKNOWN','RIGHT_STOPPER_VACO_30_RMTCMD6' , 'VALRMTCMD6'])
+        self.bltable.append(['FRONTEND_SHOPPER-L_VACO_1_STATUS0','111f-bcs.blcs.elettra.trieste.it','11.1 WhITE',-1,'UNKNOWN','FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0'])
+
+        self.bltable.append(['FRONTEND_STOPPER_VACO_1_STATUS1','112f-bcs.blcs.elettra.trieste.it','11.2 XPRESS & XRD2',-1,'UNKNOWN','FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1'])
+        self.bltable.append(['RIGHT_SHOPPER2_VACOWAGO_30_STATUS0','112f-bcs.blcs.elettra.trieste.it','11.2 XPRESS',-1,'UNKNOWN','RIGHT_SHOPPER2_VACOWAGO_30_RMTCMD0' , 'RMTCMD0'])
+        self.bltable.append(['CENTRAL_STOPPER2_VACOWAGO_20_STATUS1','112f-bcs.blcs.elettra.trieste.it','11.2 XRD2',-1,'UNKNOWN','CENTRAL_STOPPER2_VACOWAGO_20_RMTCMD1' , 'RMTCMD1'])
+        
+        #form dictionary of hosts-controlstem objetcs
+        self.hostdict={}
+        for entry in self.bltable:
+            self.nunknown=self.nunknown+1
+            self.nentries=self.nentries+1
+            if entry[1] not in self.hostdict:
+                ControlSystem = lib_pyElettra.XCS()
+                ControlSystem.open(entry[1])
+                self.hostdict[entry[1]]=ControlSystem
+                #print 'add '+entry[1]
+    def disconnect(self):
+        for host,contrsys in self.hostdict.iteritems():
+            contrsys.close()
+    def read(self):
+        self.nread=0
+        self.nerror=0
+        self.nopen=0
+        self.nclosed=0
+        self.nunknown=0
+        for entry in self.bltable:
+            ControlSystem=self.hostdict[entry[1]]
+            resp = ControlSystem.fetch(entry[0])
+            self.nread=self.nread+1
+#			print entry[0]+" "+resp[0]+" "+resp[1]
+            if resp[1]=='fetchException':
+                ntry[3]=-2
+                entry[4]='ERROR'
+                self.nerror=self.nerror+1
+#				print entry[0]+' read error'
+            else:
+                if resp[0]=='1' and resp[1].lower()=='open':
+                    entry[3]=1
+                    entry[4]='OPEN'
+                    self.nopen=self.nopen+1
+#					print entry[0]+' OPENED'
+                elif resp[0]=='0' and resp[1].lower()=='closed':
+                    entry[3]=0
+                    entry[4]='CLOSED'
+                    self.nclosed=self.nclosed+1
+#					print entry[0]+' CLOSED'
+                elif resp[0]=='3' and resp[1].lower()=='closed':
+                    entry[3]=0
+                    entry[4]='CLOSED'
+                    self.nclosed=self.nclosed+1
+                else:
+                    entry[3]=-1
+                    entry[4]='UNKNOWN'
+#					print entry[0]+' UNKNOWN '+ resp[0]+ " "+resp[1]
+    def allclosed(self):
+# return 1 ONLY if we are positvely sure that we have successufully read all the shutters and that they are closed
+        if self.nclosed==self.nread and self.nread==self.nentries:
+            return 1
+        else:
+            return 0
+        
+    def closeall(self):
+# send close command to all known front-ends shuttters,stoppers, etc.
+        nclosed=0
+        nerror=0
+        errtable=[]
+        for entry in self.bltable:
+            ControlSystem=self.hostdict[entry[1]]
+            nclosed=nclosed+1
+            print nclosed , entry[5],entry[6]
+            if len(entry[5]) > 0 and len(entry[6]) >0:
+                resp=ControlSystem.doit(entry[5],entry[6],'0') # 0 per chiudere, 1 per aprire!
+            else:
+                resp = 'OK'
+            if ( string.find(resp,'OK') == -1):
+                nerror = nerror+1
+                errtable.append([entry[1],entry[2],entry[5],entry[6]])
+        if(nerror):
+            return errtable
diff --git a/blfetest.py b/blfetest.py
new file mode 100644
index 0000000..c50bfdc
--- /dev/null
+++ b/blfetest.py
@@ -0,0 +1,11 @@
+import blfe
+
+BL=blfe.blfe()
+
+BL.read()
+
+print 'BL all closed: '+repr(BL.allclosed())
+
+BL.disconnect()
+
+#print repr(BL.bltable)
\ No newline at end of file
diff --git a/demo.py b/demo.py
new file mode 100755
index 0000000..63feed7
--- /dev/null
+++ b/demo.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+from lib_pyElettra import *
+
+
+ControlSystem = XCS()
+ControlSystem.open("112f-bcs.blcs.elettra.trieste.it")
+
+#Let's read a pressure
+#resp = ControlSystem.fetch("FRONTEND_SHUTTER_TPG300_1_B2PRESSURE")
+#if resp[1]=='fetchException':
+	#print 'Exception' + resp[0]+","+resp[1]+","+resp[2]
+#else:
+	#value = float(resp[3])
+	#print 'response: press ' + repr(value)
+
+##Let's read a valve status
+resp = ControlSystem.fetch("CENTRAL_STOPPER2_VACOWAGO_20_STATUS1")
+if resp[1]=='fetchException':
+	print 'Exception ' + resp[0]+","+resp[1]+","+resp[2]
+else:
+	print resp
+	value = int(resp[0])
+	print 'response: stat ' + repr(value)
+
+
+#Let's change a valve status
+resp = ControlSystem.doit('CENTRAL_STOPPER2_VACOWAGO_20_RMTCMD1' , 'RMTCMD1' ,0)
+if ( string.find(resp,'OK') == -1):
+	print 'doit ERROR' + resp[0]+","+resp[1]+","+resp[2]
+else:
+	print 'response: ' + resp
+
+ControlSystem.close()
diff --git a/fakedevices/HelicalID.py b/fakedevices/HelicalID.py
new file mode 100644
index 0000000..738c123
--- /dev/null
+++ b/fakedevices/HelicalID.py
@@ -0,0 +1,632 @@
+#!/usr/bin/python
+#	"$Name:  $";
+#	"$Header: /home/cvsadm/cvsroot/elettra/server/bcsbridge/fakedevices/HelicalID.py,v 1.7 2014-05-12 12:14:43 claudio Exp $";
+#=============================================================================
+#
+# file :        HelicalID.py
+#
+# description : Python source for the HelicalID and its commands. 
+#                The class is derived from Device. It represents the
+#                CORBA servant object which will be accessed from the
+#                network. All commands which can be executed on the
+#                HelicalID are implemented in this file.
+#
+# project :     TANGO Device Server
+#
+# $Author: claudio $
+#
+# $Revision: 1.7 $
+#
+# $Log: HelicalID.py,v $
+# Revision 1.7  2014-05-12 12:14:43  claudio
+# *** empty log message ***
+#
+# Revision 1.6  2013-04-19 13:30:45  claudio
+# bug correctec in write_attribute
+#
+# Revision 1.5  2013-04-19 09:55:33  claudio
+# PyTango 8.0.2 compliant
+#
+# Revision 1.4  2012-08-21 14:06:20  claudio
+# interfaccia con MoveMaxGap e SetGapTapPha
+#
+# Revision 1.3  2012-08-20 12:34:06  claudio
+# support simulations for FERMI
+#
+# Revision 1.2  2010/12/24 10:48:08  claudio
+# improved simulation of motion
+#
+# Revision 1.1  2010/08/03 15:46:15  claudio
+# for testing TCPS
+#
+#
+# copyleft :    Sincrotrone Trieste s.c.p.A.
+#
+#=============================================================================
+#  		This file is generated by POGO
+#	(Program Obviously used to Generate tango Object)
+#
+#         (c) - Software Engineering Group - ESRF
+#=============================================================================
+#
+
+
+import PyTango
+import sys
+
+
+#==================================================================
+#   HelicalID Class Description:
+#
+#         simulator for helical insertion device.
+#         Use for testing tango - bcs bridge and supervisor
+#
+#==================================================================
+# 	Device States Description:
+#
+#   DevState.ON :
+#   DevState.FAULT :
+#   DevState.UNKNOWN :
+#   DevState.MOVING :
+#==================================================================
+
+
+class HelicalID(PyTango.Device_4Impl):
+
+#--------- Add you global variables here --------------------------
+
+#------------------------------------------------------------------
+#	Device constructor
+#------------------------------------------------------------------
+	def __init__(self,cl, name):
+		PyTango.Device_4Impl.__init__(self,cl,name)
+		HelicalID.init_device(self)
+
+#------------------------------------------------------------------
+#	Device destructor
+#------------------------------------------------------------------
+	def delete_device(self):
+		print "[Device delete_device method] for device",self.get_name()
+
+
+#------------------------------------------------------------------
+#	Device initialization
+#------------------------------------------------------------------
+	def init_device(self):
+		print "In ", self.get_name(), "::init_device()"
+		self.set_state(PyTango.DevState.INIT)
+		self.get_device_properties(self.get_device_class())
+		self.attr_Enabled_read=True
+		self.attr_StatRF_read = [False,False]
+		self.attr_Gap_read = 100.0
+		self.attr_Phase_read = 0.0
+		self.attr_Taper_read = 0.0
+		self.gap_write = self.attr_Gap_read
+		self.phase_write = self.attr_Phase_read
+		self.taper_write = self.attr_Taper_read
+		self.ready = True
+		self.moving = False
+		self.set_state(PyTango.DevState.ON)
+
+#------------------------------------------------------------------
+#	Always excuted hook method
+#------------------------------------------------------------------
+	def always_executed_hook(self):
+		print "In ", self.get_name(), "::always_excuted_hook()"
+
+#==================================================================
+#
+#	HelicalID read/write attribute methods
+#
+#==================================================================
+#------------------------------------------------------------------
+#	Read Attribute Hardware
+#------------------------------------------------------------------
+	def read_attr_hardware(self,data):
+		print "In ", self.get_name(), "::read_attr_hardware()"
+		#do simulated movement
+		if self.moving:
+			self.moving=False
+			if self.gap_write != self.attr_Gap_read:
+				delta=self.gap_write - self.attr_Gap_read
+				if delta > -1.0 and delta <1.0:
+					self.attr_Gap_read = self.gap_write
+				elif delta <= -1.0:
+					self.attr_Gap_read -= 1.0
+					self.moving=True
+				elif delta >=0.0:
+					self.attr_Gap_read += 1.0
+					self.moving = True
+			
+			if self.phase_write != self.attr_Phase_read:
+				delta=self.phase_write - self.attr_Phase_read
+				if delta > -1.0 and delta <1.0:
+					self.attr_Phase_read = self.phase_write
+				elif delta <= -1.0:
+					self.attr_Phase_read -= 1.0
+					self.moving=True
+				elif delta >=0.0:
+					self.attr_Phase_read += 1.0
+					self.moving = True
+
+			if self.taper_write != self.attr_Taper_read:
+				delta=self.taper_write - self.attr_Taper_read
+				if delta > -1.0 and delta <1.0:
+					self.attr_Taper_read = self.taper_write
+				elif delta <= -1.0:
+					self.attr_Taper_read -= 1.0
+					self.moving=True
+				elif delta >=0.0:
+					self.attr_Taper_read += 1.0
+					self.moving = True
+
+
+		
+		if self.moving:
+			self.set_state(PyTango.DevState.MOVING)
+			self.set_status('moving')
+			self.ready=False #not ready
+		else:
+			self.set_state(PyTango.DevState.ON)
+			self.ready=True # ready
+			self.set_status('ON and ready')
+
+
+
+#------------------------------------------------------------------
+#	Read Enabled attribute
+#------------------------------------------------------------------
+	def read_Enabled(self, attr):
+		print "In ", self.get_name(), "::read_Enabled()"
+		
+		#	Add your own code here
+		attr.set_value(self.attr_Enabled_read)
+
+
+#------------------------------------------------------------------
+#	Read Gap attribute
+#------------------------------------------------------------------
+	def read_Gap(self, attr):
+		print "In ", self.get_name(), "::read_Gap()"
+		
+		#	Add your own code here
+		attr.set_value(self.attr_Gap_read)
+
+
+#------------------------------------------------------------------
+#	Write Gap attribute
+#------------------------------------------------------------------
+	def write_Gap(self, attr):
+		print "In ", self.get_name(), "::write_Gap()"
+		
+		data = attr.get_write_value()
+		print "Attribute value = ", data
+		#	Add your own code here
+		# raise excpetionif operation is not permitted
+		if not (self.attr_Enabled_read and self.ready):
+			msg='gap request for '+str(data)+' RESPINTA'
+			PyTango.Except.throw_exception('Rejected request',msg,'HelicalID.write_Gap()')
+		self.gap_write=data
+		self.set_state(PyTango.DevState.MOVING)
+		self.moving = True
+		self.ready=False # NOT ready
+		self.set_status('moving and not ready')
+
+
+#---- Gap attribute State Machine -----------------
+	def is_Gap_allowed(self, req_type):
+		if self.get_state() in [PyTango.DevState.FAULT,
+		                        PyTango.DevState.UNKNOWN]:
+			#	End of Generated Code
+			#	Re-Start of Generated Code
+			return False
+		return True
+
+
+#------------------------------------------------------------------
+#	Read Phase attribute
+#------------------------------------------------------------------
+	def read_Phase(self, attr):
+		print "In ", self.get_name(), "::read_Phase()"
+		
+		#	Add your own code here
+		attr.set_value(self.attr_Phase_read)
+
+
+#------------------------------------------------------------------
+#	Write Phase attribute
+#------------------------------------------------------------------
+	def write_Phase(self, attr):
+		print "In ", self.get_name(), "::write_Phase()"
+		data = attr.get_write_value()
+		print "Attribute value = ", data
+
+		#	Add your own code here
+		if not (self.attr_Enabled_read and self.ready):
+			msg='phase request for '+str(data)+' RESPINTA'
+			PyTango.Except.throw_exception('Rejected request',msg,'HelicalID.write_Phase()')
+		self.phase_write=data
+		self.set_state(PyTango.DevState.MOVING)
+		self.moving = True
+		self.ready=False # NOT ready
+		self.set_status('moving and not ready')
+
+
+#---- Phase attribute State Machine -----------------
+	def is_Phase_allowed(self, req_type):
+		if self.get_state() in [PyTango.DevState.FAULT,
+		                        PyTango.DevState.UNKNOWN]:
+			#	End of Generated Code
+			#	Re-Start of Generated Code
+			return False
+		return True
+
+
+#------------------------------------------------------------------
+#	Read Taper attribute
+#------------------------------------------------------------------
+	def read_Taper(self, attr):
+		print "In ", self.get_name(), "::read_Taper()"
+		
+		#	Add your own code here
+		
+		attr.set_value(self.attr_Taper_read)
+
+
+#------------------------------------------------------------------
+#	Write Taper attribute
+#------------------------------------------------------------------
+	def write_Taper(self, attr):
+		print "In ", self.get_name(), "::write_Taper()"
+		data= attr.get_write_value()
+		print "Attribute value = ", data
+
+		#	Add your own code here
+		if not (self.attr_Enabled_read and self.ready):
+			msg='phase request for '+str(data)+' RESPINTA'
+			PyTango.Except.throw_exception('Rejected request',msg,'HelicalID.write_Phase()')
+		self.taper_write=data
+		self.set_state(PyTango.DevState.MOVING)
+		self.moving = True
+		self.ready=False # NOT ready
+		self.set_status('moving and not ready')
+
+
+#---- Taper attribute State Machine -----------------
+	def is_Taper_allowed(self, req_type):
+		if self.get_state() in [PyTango.DevState.FAULT,
+		                        PyTango.DevState.UNKNOWN]:
+			#	End of Generated Code
+			#	Re-Start of Generated Code
+			return False
+		return True
+
+
+#------------------------------------------------------------------
+#	Read GapSetPoint attribute
+#------------------------------------------------------------------
+	def read_GapSetPoint(self, attr):
+		print "In ", self.get_name(), "::read_GapSetPoint()"
+		
+		#	Add your own code here
+		
+		attr.set_value(self.gap_write)
+
+
+#---- GapSetPoint attribute State Machine -----------------
+	def is_GapSetPoint_allowed(self, req_type):
+		if self.get_state() in [PyTango.DevState.FAULT,
+		                        PyTango.DevState.UNKNOWN]:
+			#	End of Generated Code
+			#	Re-Start of Generated Code
+			return False
+		return True
+
+
+#------------------------------------------------------------------
+#	Read PhaseSetPoint attribute
+#------------------------------------------------------------------
+	def read_PhaseSetPoint(self, attr):
+		print "In ", self.get_name(), "::read_PhaseSetPoint()"
+		
+		#	Add your own code here
+		
+		attr.set_value(self.phase_write)
+
+
+#---- PhaseSetPoint attribute State Machine -----------------
+	def is_PhaseSetPoint_allowed(self, req_type):
+		if self.get_state() in [PyTango.DevState.FAULT,
+		                        PyTango.DevState.UNKNOWN]:
+			#	End of Generated Code
+			#	Re-Start of Generated Code
+			return False
+		return True
+
+
+#------------------------------------------------------------------
+#	Read TaperSetPoint attribute
+#------------------------------------------------------------------
+	def read_TaperSetPoint(self, attr):
+		print "In ", self.get_name(), "::read_TaperSetPoint()"
+		
+		#	Add your own code here
+		
+		
+		attr.set_value(self.taper_write)
+
+
+#---- TaperSetPoint attribute State Machine -----------------
+	def is_TaperSetPoint_allowed(self, req_type):
+		if self.get_state() in [PyTango.DevState.FAULT,
+		                        PyTango.DevState.UNKNOWN]:
+			#	End of Generated Code
+			#	Re-Start of Generated Code
+			return False
+		return True
+
+
+#------------------------------------------------------------------
+#	Read StatRF attribute
+#------------------------------------------------------------------
+	def read_StatRF(self, attr):
+		print "In ", self.get_name(), "::read_StatRF()"
+		
+		#	Add your own code here
+		
+		attr_StatRF_read = [self.ready,self.attr_Enabled_read]
+		attr.set_value(attr_StatRF_read, 2)
+
+
+
+#==================================================================
+#
+#	HelicalID command methods
+#
+#==================================================================
+
+#------------------------------------------------------------------
+#	Remote command:
+#
+#	Description: enable remote operations for beamlines
+#                
+#------------------------------------------------------------------
+	def Remote(self):
+		print "In ", self.get_name(), "::Remote()"
+		#	Add your own code here
+		self.attr_Enabled_read=True
+
+
+#------------------------------------------------------------------
+#	Local command:
+#
+#	Description: inhibit remote operations to beamlines
+#                
+#------------------------------------------------------------------
+	def Local(self):
+		print "In ", self.get_name(), "::Local()"
+		#	Add your own code here
+		self.attr_Enabled_read=False
+
+
+#------------------------------------------------------------------
+#	MoveMaxGap command:
+#
+#	Description: go to max gap , rest position
+#                
+#------------------------------------------------------------------
+	def MoveMaxGap(self):
+		print "In ", self.get_name(), "::MoveMaxGap()"
+		#	Add your own code here
+		self.gap_write = self.MaxGap
+		self.phase_write = 0.0
+		self.taper_write = 0.0
+		self.set_state(PyTango.DevState.MOVING)
+		self.ready=False # NOT ready
+		self.moving = True
+		self.set_status('moving and not ready')
+		return
+
+
+#------------------------------------------------------------------
+#	SetGapTapPha command:
+#
+#	Description: set new working point in one go
+#                
+#	argin:  DevVarDoubleArray	gap, taper, phase
+#------------------------------------------------------------------
+	def SetGapTapPha(self, argin):
+		print "In ", self.get_name(), "::SetGapTapPha()"
+		#	Add your own code here
+		self.gap_write = argin[0]
+		self.taper_write = argin[1]
+		self.phase_write = argin[2]
+		self.set_state(PyTango.DevState.MOVING)
+		self.moving = True
+		self.ready=False # NOT ready
+		self.set_status('moving and not ready')
+
+
+#------------------------------------------------------------------
+#	Stop command:
+#
+#	Description: Stop movement
+#                
+#------------------------------------------------------------------
+	def Stop(self):
+		print "In ", self.get_name(), "::Stop()"
+		#	Add your own code here
+		self.moving = False
+
+
+#==================================================================
+#
+#	HelicalIDClass class definition
+#
+#==================================================================
+class HelicalIDClass(PyTango.DeviceClass):
+
+	#	Class Properties
+	class_property_list = {
+		}
+
+
+	#	Device Properties
+	device_property_list = {
+		'NumAxes':
+			[PyTango.DevLong,
+			"number of mechanical axes , 6, 4, or 2",
+			[ 6 ] ],
+		'MaxGap':
+			[PyTango.DevDouble,
+			"gap value for rest position",
+			[ 190.0 ] ],
+		}
+
+
+	#	Command definitions
+	cmd_list = {
+		'Remote':
+			[[PyTango.DevVoid, ""],
+			[PyTango.DevVoid, ""]],
+		'Local':
+			[[PyTango.DevVoid, ""],
+			[PyTango.DevVoid, ""]],
+		'MoveMaxGap':
+			[[PyTango.DevVoid, ""],
+			[PyTango.DevVoid, ""]],
+		'SetGapTapPha':
+			[[PyTango.DevVarDoubleArray, "gap, taper, phase"],
+			[PyTango.DevVoid, ""]],
+		'Stop':
+			[[PyTango.DevVoid, ""],
+			[PyTango.DevVoid, ""]],
+		}
+
+
+	#	Attribute definitions
+	attr_list = {
+		'Enabled':
+			[[PyTango.DevBoolean,
+			PyTango.SCALAR,
+			PyTango.READ],
+			{
+				'label':"enabled",
+				'description':"true when operator enables remote operation",
+			} ],
+		'Gap':
+			[[PyTango.DevDouble,
+			PyTango.SCALAR,
+			PyTango.READ_WRITE],
+			{
+				'label':"gap",
+				'unit':"mm",
+				'standard unit':1,
+				'display unit':"mm",
+				'format':"%6.3f",
+				'max value':190,
+				'min value':10.0,
+				'description':"magnetic gap of id",
+			} ],
+		'Phase':
+			[[PyTango.DevDouble,
+			PyTango.SCALAR,
+			PyTango.READ_WRITE],
+			{
+				'label':"phase",
+				'unit':"mm",
+				'standard unit':1,
+				'display unit':"mm",
+				'format':"%6.3f",
+				'description':"carriage magnetic phase",
+			} ],
+		'Taper':
+			[[PyTango.DevDouble,
+			PyTango.SCALAR,
+			PyTango.READ_WRITE],
+			{
+				'label':"taper",
+				'unit':"mm",
+				'standard unit':1,
+				'display unit':"mm",
+				'format':"%6.3f",
+				'max value':10,
+				'min value':-10,
+				'description':"magnetic tapering of id",
+			} ],
+		'GapSetPoint':
+			[[PyTango.DevDouble,
+			PyTango.SCALAR,
+			PyTango.READ],
+			{
+				'label':"gap set point",
+				'unit':"mm",
+				'standard unit':1,
+				'display unit':"mm",
+				'format':"%6.3f",
+				'max value':190,
+				'min value':10.0,
+				'description':"set point of magnetic gap of id",
+			} ],
+		'PhaseSetPoint':
+			[[PyTango.DevDouble,
+			PyTango.SCALAR,
+			PyTango.READ],
+			{
+				'label':"phase set point",
+				'unit':"mm",
+				'standard unit':1,
+				'display unit':"mm",
+				'format':"%6.3f",
+				'description':"set point of carriage magnetic phase",
+			} ],
+		'TaperSetPoint':
+			[[PyTango.DevDouble,
+			PyTango.SCALAR,
+			PyTango.READ],
+			{
+				'label':"taper set point",
+				'unit':"mm",
+				'standard unit':1,
+				'display unit':"mm",
+				'format':"%6.3f",
+				'max value':150,
+				'min value':19,
+				'description':"set point of magnetic tapering  of id",
+			} ],
+		'StatRF':
+			[[PyTango.DevBoolean,
+			PyTango.SPECTRUM,
+			PyTango.READ, 2],
+			{
+				'label':"enabled,ready",
+			} ],
+		}
+
+
+#------------------------------------------------------------------
+#	HelicalIDClass Constructor
+#------------------------------------------------------------------
+	def __init__(self, name):
+		PyTango.DeviceClass.__init__(self, name)
+		self.set_type(name);
+		print "In HelicalIDClass  constructor"
+
+#==================================================================
+#
+#	HelicalID class main method
+#
+#==================================================================
+if __name__ == '__main__':
+	try:
+		py = PyTango.Util(sys.argv)
+		py.add_TgClass(HelicalIDClass,HelicalID,'HelicalID')
+
+		U = PyTango.Util.instance()
+		U.server_init()
+		U.server_run()
+
+	except PyTango.DevFailed,e:
+		print '-------> Received a DevFailed exception:',e
+	except Exception,e:
+		print '-------> An unforeseen exception occured....',e
diff --git a/fakedevices/KymaID.py b/fakedevices/KymaID.py
new file mode 100755
index 0000000..320f3fd
--- /dev/null
+++ b/fakedevices/KymaID.py
@@ -0,0 +1,323 @@
+#!/usr/bin/python
+#	"$Name:  $";
+#	"$Header: /home/cvsadm/cvsroot/elettra/server/bcsbridge/fakedevices/KymaID.py,v 1.1 2010/12/24 10:48:38 claudio Exp $";
+#=============================================================================
+#
+# file :        KymaID.py
+#
+# description : Python source for the KymaID and its commands. 
+#                The class is derived from Device. It represents the
+#                CORBA servant object which will be accessed from the
+#                network. All commands which can be executed on the
+#                KymaID are implemented in this file.
+#
+# project :     TANGO Device Server
+#
+# $Author: claudio $
+#
+# $Revision: 1.1 $
+#
+# $Log: KymaID.py,v $
+# Revision 1.1  2010/12/24 10:48:38  claudio
+# crude superesca simulator
+#
+# Revision 1.1  2010/08/03 15:46:15  claudio
+# for testing TCPS
+#
+#
+# copyleft :    Sincrotrone Trieste s.c.p.A.
+#
+#=============================================================================
+#  		This file is generated by POGO
+#	(Program Obviously used to Generate tango Object)
+#
+#         (c) - Software Engineering Group - ESRF
+#=============================================================================
+#
+
+
+import PyTango
+import sys
+
+
+#==================================================================
+#   KymaID Class Description:
+#
+#         simulator for helical insertion device.
+#         Use for testing tango - bcs bridge and supervisor
+#
+#==================================================================
+# 	Device States Description:
+#
+#   DevState.ON :
+#   DevState.FAULT :
+#   DevState.UNKNOWN :
+#   DevState.MOVING :
+#==================================================================
+
+
+class KymaID(PyTango.Device_4Impl):
+
+#--------- Add you global variables here --------------------------
+
+#------------------------------------------------------------------
+#	Device constructor
+#------------------------------------------------------------------
+	def __init__(self,cl, name):
+		PyTango.Device_4Impl.__init__(self,cl,name)
+		KymaID.init_device(self)
+
+#------------------------------------------------------------------
+#	Device destructor
+#------------------------------------------------------------------
+	def delete_device(self):
+		print "[Device delete_device method] for device",self.get_name()
+
+
+#------------------------------------------------------------------
+#	Device initialization
+#------------------------------------------------------------------
+	def init_device(self):
+		print "In ", self.get_name(), "::init_device()"
+		self.set_state(PyTango.DevState.INIT)
+		self.get_device_properties(self.get_device_class())
+		self.attr_StatRF_read = [False,False]
+		self.attr_Gap_read = 50.0
+		self.attr_Tapering_read = 0.0
+		self.gap_write=self.attr_Gap_read
+		self.taper_write=self.attr_Tapering_read
+		self.ready=True
+		self.set_state(PyTango.DevState.ON)
+
+#------------------------------------------------------------------
+#	Always excuted hook method
+#------------------------------------------------------------------
+	def always_executed_hook(self):
+		print "In ", self.get_name(), "::always_excuted_hook()"
+
+
+#==================================================================
+#
+#	KymaID read/write attribute methods
+#
+#==================================================================
+#------------------------------------------------------------------
+#	Read Attribute Hardware
+#------------------------------------------------------------------
+	def read_attr_hardware(self,data):
+		print "In ", self.get_name(), "::read_attr_hardware()"
+		#do simulated movement
+		moving=False
+		if self.gap_write != self.attr_Gap_read:
+			delta=self.gap_write - self.attr_Gap_read
+			if delta > -1.0 and delta <1.0:
+				self.attr_Gap_read = self.gap_write
+			elif delta <= -1.0:
+				self.attr_Gap_read -= 1.0
+				moving=True
+			elif delta >=0.0:
+				self.attr_Gap_read += 1.0
+				moving = True
+		
+		if self.taper_write != self.attr_Tapering_read:
+			delta=self.taper_write - self.attr_Tapering_read
+			if delta > -1.0 and delta <1.0:
+				self.attr_Tapering_read = self.taper_write
+			elif delta <= -1.0:
+				self.attr_Tapering_read -= 1.0
+				moving=True
+			elif delta >=0.0:
+				self.attr_Tapering_read += 1.0
+				moving = True
+		
+		if moving:
+			self.set_state(PyTango.DevState.MOVING)
+			self.set_status('moving')
+			self.ready=False #not ready
+		else:
+			self.set_state(PyTango.DevState.ON)
+			self.ready=True # ready
+			self.set_status('ON and ready')
+
+
+
+#------------------------------------------------------------------
+#	Read Gap attribute
+#------------------------------------------------------------------
+	def read_Gap(self, attr):
+		print "In ", self.get_name(), "::read_Gap()"
+		
+		#	Add your own code here
+		attr.set_value(self.attr_Gap_read)
+
+
+#------------------------------------------------------------------
+#	Write Gap attribute
+#------------------------------------------------------------------
+	def write_Gap(self, attr):
+		print "In ", self.get_name(), "::write_Gap()"
+		data=[]
+		attr.get_write_value(data)
+		print "Attribute value = ", data
+		#	Add your own code here
+		# raise excpetionif operation is not permitted
+		self.gap_write=data[0]
+		self.set_state(PyTango.DevState.MOVING)
+		self.ready=False # NOT ready
+		self.set_status('moving and not ready')
+
+
+#---- Gap attribute State Machine -----------------
+	def is_Gap_allowed(self, req_type):
+		if self.get_state() in [PyTango.DevState.FAULT,
+		                        PyTango.DevState.UNKNOWN]:
+			#	End of Generated Code
+			#	Re-Start of Generated Code
+			return False
+		return True
+
+
+#------------------------------------------------------------------
+#	Read Tapering attribute
+#------------------------------------------------------------------
+	def read_Tapering(self, attr):
+		print "In ", self.get_name(), "::read_Tapering()"
+		
+		#	Add your own code here
+		attr.set_value(self.attr_Tapering_read)
+
+
+#------------------------------------------------------------------
+#	Write Tapering attribute
+#------------------------------------------------------------------
+	def write_Tapering(self, attr):
+		print "In ", self.get_name(), "::write_Tapering()"
+		data=[]
+		attr.get_write_value(data)
+		print "Attribute value = ", data
+
+		#	Add your own code here
+		self.taper_write=data[0]
+		self.set_state(PyTango.DevState.MOVING)
+		self.ready=False # NOT ready
+		self.set_status('moving and not ready')
+
+
+#---- Tapering attribute State Machine -----------------
+	def is_Tapering_allowed(self, req_type):
+		if self.get_state() in [PyTango.DevState.FAULT,
+		                        PyTango.DevState.UNKNOWN]:
+			#	End of Generated Code
+			#	Re-Start of Generated Code
+			return False
+		return True
+
+
+#------------------------------------------------------------------
+#	Read StatRF attribute
+#------------------------------------------------------------------
+	def read_StatRF(self, attr):
+		print "In ", self.get_name(), "::read_StatRF()"
+		
+		#	Add your own code here
+		
+		attr_StatRF_read = [True,True]
+		attr.set_value(attr_StatRF_read, 2)
+
+
+
+#==================================================================
+#
+#	KymaID command methods
+#
+#==================================================================
+
+#==================================================================
+#
+#	KymaIDClass class definition
+#
+#==================================================================
+class KymaIDClass(PyTango.DeviceClass):
+
+	#	Class Properties
+	class_property_list = {
+		}
+
+
+	#	Device Properties
+	device_property_list = {
+		}
+
+
+	#	Command definitions
+	cmd_list = {
+		}
+
+
+	#	Attribute definitions
+	attr_list = {
+		'Gap':
+			[[PyTango.DevDouble,
+			PyTango.SCALAR,
+			PyTango.READ_WRITE],
+			{
+				'label':"gap",
+				'unit':"mm",
+				'standard unit':1,
+				'display unit':"mm",
+				'format':"%6.3f",
+				'max value':150,
+				'min value':14,
+				'description':"magnetic gap of id",
+				'Polling period':2000,
+			} ],
+		'Tapering':
+			[[PyTango.DevDouble,
+			PyTango.SCALAR,
+			PyTango.READ_WRITE],
+			{
+				'label':"taper",
+				'unit':"mm",
+				'standard unit':1,
+				'display unit':"mm",
+				'format':"%6.3f",
+				'max value':3,
+				'min value':-3,
+				'description':"carriage magnetic taper",
+			} ],
+		'StatRF':
+			[[PyTango.DevBoolean,
+			PyTango.SPECTRUM,
+			PyTango.READ, 2],
+			{
+				'label':"enabled,ready",
+			} ],
+		}
+
+
+#------------------------------------------------------------------
+#	KymaIDClass Constructor
+#------------------------------------------------------------------
+	def __init__(self, name):
+		PyTango.DeviceClass.__init__(self, name)
+		self.set_type(name);
+		print "In KymaIDClass  constructor"
+
+#==================================================================
+#
+#	KymaID class main method
+#
+#==================================================================
+if __name__ == '__main__':
+	try:
+		py = PyTango.Util(sys.argv)
+		py.add_TgClass(KymaIDClass,KymaID,'KymaID')
+
+		U = PyTango.Util.instance()
+		U.server_init()
+		U.server_run()
+
+	except PyTango.DevFailed,e:
+		print '-------> Received a DevFailed exception:',e
+	except Exception,e:
+		print '-------> An unforeseen exception occured....',e
diff --git a/fakedevices/TangoClassID.txt b/fakedevices/TangoClassID.txt
new file mode 100644
index 0000000..328b46a
--- /dev/null
+++ b/fakedevices/TangoClassID.txt
@@ -0,0 +1,11 @@
+/**
+ * Device Class Identification:
+ * 
+ * Class Name   :	HelicalID
+ * Contact      :	claudio.scafuri@elettra.trieste.it
+ * Class Family :	Simulators
+ * Platform     :	All Platforms
+ * Bus          :	Not Applicable
+ * Manufacturer :	none
+ * Reference    :	
+ */
diff --git a/lib_pyElettra.py b/lib_pyElettra.py
new file mode 100644
index 0000000..5dc7a01
--- /dev/null
+++ b/lib_pyElettra.py
@@ -0,0 +1,143 @@
+# class for SET/GET client operations with TPCS protocol
+# used by Elettra beamlines
+# $Author:Roberto Borghes
+#
+# $Version:$
+#
+# $Log: lib_pyElettra.py,v $
+# Revision 1.1  2008/09/23 09:12:10  claudio
+# First import
+#
+#
+import string
+from socket import *
+from threading import Lock
+import time
+import httplib
+
+class XCSException(Exception):
+	def __init__(self, value):
+		self.value = value
+	def __str__(self):
+		return `self.value`
+
+class XCS:
+ 	def __init__(self, mode=None):
+		if mode == None:
+			self.mode = 'TCP'
+			self.port = 20000
+		elif mode == 'HTTP':
+			self.mode = mode
+			self.port = 80
+		else:
+			raise XCSException, 'Unsupported Mode: '+mode 
+		self.host = ""
+		self.sid = 0
+		self.mutex = Lock()
+			
+	def open(self, host, port=None):
+		self.host = host
+		if port != None:
+			self.port = port
+		if self.mode == 'TCP':
+			self.mutex.acquire()
+			try:
+				self.sid = socket(AF_INET, SOCK_STREAM)
+				self.sid.connect((self.host,self.port))
+			finally:
+				self.mutex.release()
+		elif self.mode == 'HTTP':
+			self.sid = 0
+		else:
+			raise XCSException, 'Not Implemented Yet!' 					
+	
+	def close(self):
+		if self.sid != 0:
+			self.mutex.acquire()
+			try:
+				self.sid.close()
+				self.sid = 0
+			finally:
+				self.mutex.release()
+					
+	def get(self, var):
+		if self.mode == 'TCP':
+			if string.find(var,"UES") != -1:
+				getvar = "GETUES "+var+"\r\n"
+			else:
+				getvar = "GET "+var+"\r\n"
+			self.mutex.acquire()
+			try:
+				self.sid.send(getvar)
+				retvar = self.sid.recv(256)
+			finally:
+				self.mutex.release()
+			line = string.split(retvar,"\r")
+			if string.find(line[0],"*** ERROR") != -1:
+				raise XCSException, line[0]
+			res = string.split(line[0],",")
+			if string.find(var,"UES") != -1:
+				return(res[0],'',res[1],time.time())
+			else:
+				return (res[3],res[4],res[2],time.time())
+		if self.mode == 'HTTP':
+			getvar = "/blcs/"+var+"?ACTION=GET&METHOD=TEXT"
+			conn = httplib.HTTPConnection(self.host,self.port)
+			conn.request("GET",getvar)
+			retvar = conn.getresponse()
+			line = retvar.read()
+			if string.find(line,"----------") != -1 or retvar.status != 200:
+				raise XCSException, line
+			res = string.split(line,",")
+			conn.close()
+			return (res[2],res[3],res[1],time.time())
+		else:
+			raise XCSException, 'Not Implemented Yet!' 					
+		
+	def set(self, var, values=None):
+		if self.mode == 'TCP':
+			if string.find(var,"UES") != -1:
+				setvar = "UES "+var
+				if values != None:
+					for p,v in values.items():
+						setvar = setvar +" "+str(v)
+			else:
+				setvar = "SET "+var
+				if values != None:
+					for p,v in values.items():
+						setvar = setvar +" "+p+","+str(v)
+			setvar = setvar + "\n"	
+			self.mutex.acquire()
+			try:
+				self.sid.send(setvar)
+				retvar = self.sid.recv(256)
+				
+			finally:
+				self.mutex.release()
+			line = string.split(retvar,"\r")
+			if string.find(line[0],"*** ERROR") != -1:
+				raise XCSException, line[0]
+			return line[0]		
+		else:
+			raise XCSException, 'Not Implemented Yet!' 					
+		
+	def fetch(self,variable):
+		try:
+			a = self.get(variable)
+		except:
+			a = ('0','fetch Exception')
+		return a
+
+
+	def doit(self,target,par1=None,val1=None,par2=None,val2=None):
+		try:
+        		if (par1 == None):
+        			a = self.set(target)
+        		elif (par2 == None):
+				a = self.set(target,{par1:val1} )
+        		else:
+        			a = self.set(target,{par1:val1,par2:val2})
+		except:
+        		a = "  Exception"
+#      		print a
+		return a
diff --git a/punti_da_comandare.cfg.txt b/punti_da_comandare.cfg.txt
new file mode 100644
index 0000000..3569150
--- /dev/null
+++ b/punti_da_comandare.cfg.txt
@@ -0,0 +1,84 @@
+Valore 0 x chiudere e 1 x aprire
+
+# 1.1M
+'FRONTEND_SHOPPER-L_VACO_1_RMTCMD2','VALRMTCMD2'
+
+# 1.2 - frontend
+'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' 
+'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 1.0 - backend
+'BACKEND_SHOPPER_VACOBECK_20_RMTCMD0' , 'RMTCMD0' 
+
+# 2.2
+'022F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1' 
+'022F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 3.2
+'032F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1' 
+'032F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 4.2
+'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' 
+'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 5.2
+'052F_WSTOPPER1F_VACO_1_RMTCMD4' , 'VALRMTCMD4' 
+'XRD_STOPPER1_VACO_11_RMTCMD0' , 'VALRMTCMD0' 
+'XRD_STOPPER2_VACO_10_RMTCMD3' , 'VALRMTCMD3' 
+'XRD_STOPPER3_VACO_10_RMTCMD2' , 'VALRMTCMD2' 
+'052F_WSHUTTER1F_VACO_1_RMTCMD5' , 'VALRMTCMD5' 
+
+# 6.1
+'061F_BSTOPPERAF_VACO_2_RMTCMD2' , 'VALRMTCMD2' 
+'061F_BSTOPPERCF_VACO_1_RMTCMD2' , 'VALRMTCMD2' 
+'061A_BSTOPPER1A_VACO_10_RMTCMD2' , 'VALRMTCMD2' 
+'061F_BSHUTTERAF_VACO_2_RMTCMD0' , 'VALRMTCMD0' 
+'061F_BSHUTTERCF_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 6.2
+'062F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1' 
+'062F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 7.1
+'FRONTEND_SHOPPER-R_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+'RIGHT_SHUTTER_VACO_30_RMTCMD4' , 'VALRMTCMD4' 
+
+# 7.2
+'072F_USTOPPER1F_VACO_1_RMTCMD1' , 'VALRMTCMD1' 
+'072F_USHUTTER1F_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 8.1
+'FRONTEND_SHOPPER-R_VACO_2_RMTCMD0' , 'VALRMTCMD0' 
+'FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+'RIGHT_EXSLIT_VACO_10_RMTCMD4' , 'VALRMTCMD4' 
+
+# 8.2
+'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' 
+'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 9.1
+'CENTRAL_STOPPER_VACO_20_RMTCMD0' , 'VALRMTCMD0' 
+
+# 9.2
+'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' 
+'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 10.1
+'FRONTEND_SHOPPER-R_VACO_1_RMTCMD4' , 'VALRMTCMD4' 
+'FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 10.2
+'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' 
+'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 11.1
+'FRONTEND_SHOPPER-R_VACO_2_RMTCMD0' , 'VALRMTCMD0' 
+'RIGHT_STOPPER_VACO_30_RMTCMD6' , 'VALRMTCMD6' 
+'FRONTEND_SHOPPER-L_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+# 11.2
+'FRONTEND_STOPPER_VACO_1_RMTCMD1' , 'VALRMTCMD1' 
+'FRONTEND_SHUTTER_VACO_1_RMTCMD0' , 'VALRMTCMD0' 
+
+
diff --git a/punti_di_lettura.cfg.txt b/punti_di_lettura.cfg.txt
new file mode 100644
index 0000000..697fd0e
--- /dev/null
+++ b/punti_di_lettura.cfg.txt
@@ -0,0 +1,92 @@
+# Syntax:
+# ecs_name bcs_name
+# FAM_MEM_ACT_MOD BL_SECT_COMP_INSTR_N_NAME
+
+# 1.1M
+'FRONTEND_SHOPPER-L_VACO_1_STATUS2'
+
+# 1.2 - frontend
+'FRONTEND_STOPPER_VACO_1_STATUS1'
+'FRONTEND_SHUTTER_VACO_1_STATUS0'
+
+# 1.0 - backend
+'BACKEND_SHOPPER_VACOBECK_20_STATUS0'
+
+# 2.2
+'022F_USTOPPER1F_VACO_1_STATUS1'
+'022F_USHUTTER1F_VACO_1_STATUS0'
+
+# 3.2
+'032F_USTOPPER1F_VACO_1_STATUS1'
+'032F_USHUTTER1F_VACO_1_STATUS0'
+
+# 4.2
+'FRONTEND_STOPPER_VACO_1_STATUS1'
+'FRONTEND_SHUTTER_VACO_1_STATUS0'
+
+# 5.2
+'XRD_STOPPER1_VACO_11_STATUS0'
+'XRD_STOPPER2_VACO_10_STATUS3'
+'XRD_STOPPER3_VACO_10_STATUS2'
+'052F_WSHUTTER1F_VACO_1_STATUS5'
+
+# 6.1
+'061F_BSTOPPERAF_VACO_2_STATUS2'
+'061F_BSTOPPERCF_VACO_1_STATUS2'
+'061A_BSTOPPER1A_VACO_10_STATUS2'
+'061F_BSHUTTERAF_VACO_2_STATUS0'
+'061F_BSHUTTERCF_VACO_1_STATUS0'
+
+# 6.2
+'062F_USTOPPER1F_VACO_1_STATUS1'
+'062F_USHUTTER1F_VACO_1_STATUS0'
+
+# 7.1
+'FRONTEND_SHOPPER-R_VACO_1_STATUS0'
+'RIGHT_SHUTTER_VACO_30_STATUS4'
+
+# 7.2
+'072F_USTOPPER1F_VACO_1_STATUS1'
+'072F_USHUTTER1F_VACO_1_STATUS0'
+
+# 8.1
+'FRONTEND_SHOPPER-R_VACO_2_STATUS0'
+'FRONTEND_SHOPPER-L_VACO_1_STATUS0'
+'RIGHT_EXSLIT_VACO_10_STATUS4'
+
+# 8.2
+'FRONTEND_STOPPER_VACO_1_STATUS1'
+'FRONTEND_SHUTTER_VACO_1_STATUS0'
+
+
+# 9.1
+'CENTRAL_STOPPER_VACO_20_STATUS0'
+
+# 9.2
+'FRONTEND_STOPPER_VACO_1_STATUS1'
+'FRONTEND_SHUTTER_VACO_1_STATUS0'
+
+# 10.1
+'FRONTEND_SHOPPER-R_VACO_1_STATUS4'
+'FRONTEND_SHOPPER-L_VACO_1_STATUS0'
+
+# 10.2
+'FRONTEND_STOPPER_VACO_1_STATUS1'
+'FRONTEND_SHUTTER_VACO_1_STATUS0'
+
+# 11.1
+'FRONTEND_SHOPPER-R_VACO_2_STATUS0'
+'RIGHT_STOPPER_VACO_30_STATUS6'
+'FRONTEND_SHOPPER-L_VACO_1_STATUS0'
+
+# 11.2
+'FRONTEND_STOPPER_VACO_1_STATUS1'
+'FRONTEND_SHUTTER_VACO_1_STATUS0'
+
+
+Gli host sono:
+011f-bcs.blcs.elettra.trieste.it
+012f-bcs.blcs.elettra.trieste.it
+022f-bcs.blcs.elettra.trieste.it
+032f-bcs.blcs.elettra.trieste.it
+112f-bcs.blcs.elettra.trieste.it
diff --git a/tabella-bemline-id.ods b/tabella-bemline-id.ods
new file mode 100644
index 0000000000000000000000000000000000000000..a524ea6be33abd98e7cce73480429817a2a68703
GIT binary patch
literal 27832
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

literal 0
HcmV?d00001

diff --git a/testsissi.py b/testsissi.py
new file mode 100644
index 0000000..0a51adb
--- /dev/null
+++ b/testsissi.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+import telnetlib
+import time
+import sys
+tn=telnetlib.Telnet('ecsproxy',20091)
+
+ans_old=''
+while True:
+    tn.write('GET FRONTEND_MACHINE_MACHINE_1_BEAMON')
+    ans = tn.read_until('\n')
+    if ans != ans_old:
+        print time.ctime(), ans.rstrip(), ' <<<< variazione'
+        ans_old = ans
+    else:
+        pass
+        #print time.ctime(), ans.rstrip()
+    sys.stdout.flush()
+    time.sleep(1)
+            
-- 
GitLab