Skip to content
Snippets Groups Projects
Commit ae7519a0 authored by BRONES Romain's avatar BRONES Romain
Browse files

First sources and docs

* Python skeleton generated with POGO (xmi file)
* Most attribute tested
* Start/stop not tested
parent 1aef1344
No related branches found
No related tags found
No related merge requests found
# -*- coding: utf-8 -*-
#
# This file is part of the DG_PY_FOFBLegacy project
#
#
#
# Distributed under the terms of the GPL license.
# See LICENSE.txt for more info.
""" FOFBLegacy
This device is used for backward compatibility for the new FOFB Control (FOFBWatcher and FOFBControl).
It gives access to Attributes and Commands offered previously by FOFB-Manager
"""
# PyTango imports
import tango
from tango import DebugIt
from tango.server import run
from tango.server import Device
from tango.server import attribute, command
from tango.server import device_property
from tango import AttrQuality, DispLevel, DevState
from tango import AttrWriteType, PipeWriteType
# Additional import
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.additionnal_import) ENABLED START -----#
import datetime
import numpy as np
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.additionnal_import
__all__ = ["DG_PY_FOFBLegacy", "main"]
class DG_PY_FOFBLegacy(Device):
"""
This device is used for backward compatibility for the new FOFB Control (FOFBWatcher and FOFBControl).
It gives access to Attributes and Commands offered previously by FOFB-Manager
**Properties:**
- Device Property
FofbCommand
- Tango path to the FofbCommand device
- Type:'DevString'
FofbWatcher
- Tango path to the FofbWatcher device
- Type:'DevString'
FofbManager
- Tango path to the Fofb-Manager device.
- Type:'DevString'
"""
# PROTECTED REGION ID(DG_PY_FOFBLegacy.class_variable) ENABLED START #
d_status = {}
"""
def dev_status(self):
return my_status()
"""
def my_status(self):
try:
return "\n\n".join([str(v) for v in self.d_status.values()])+"\n"
except Exception:
self.debug_stream(str(self.d_status))
return "Status failure\n"
# PROTECTED REGION END # // DG_PY_FOFBLegacy.class_variable
# -----------------
# Device Properties
# -----------------
FofbCommand = device_property(
dtype='DevString',
mandatory=True
)
FofbWatcher = device_property(
dtype='DevString',
mandatory=True
)
FofbManager = device_property(
dtype='DevString',
mandatory=True
)
# ----------
# Attributes
# ----------
xRefOrbitLoadedOnDevice = attribute(
dtype='DevBoolean',
doc="Simply check that the local attribute is not empty/zeros",
)
xRefOrbitLoadedOnBpms = attribute(
dtype='DevBoolean',
doc="Translated to checking the date of attribute in FofbCommand and the loading date recorded in a attribute by FofbCommand",
)
zRefOrbitLoadedOnDevice = attribute(
dtype='DevBoolean',
doc="Simply check that the local attribute is not empty/zeros",
)
zRefOrbitLoadedOnBpms = attribute(
dtype='DevBoolean',
doc="Translated to checking the date of attribute in FofbCommand and the loading date recorded in a attribute by FofbCommand",
)
xInvRespMatrixLoadedOnDevice = attribute(
dtype='DevBoolean',
doc="Simply check that the local attribute is not empty/zeros",
)
xInvRespMatrixLoadedOnBpms = attribute(
dtype='DevBoolean',
doc="Translated to checking the date of attribute in FofbCommand and the loading date recorded in a attribute by FofbCommand",
)
zInvRespMatrixLoadedOnDevice = attribute(
dtype='DevBoolean',
doc="Simply check that the local attribute is not empty/zeros",
)
zInvRespMatrixLoadedOnBpms = attribute(
dtype='DevBoolean',
doc="Translated to checking the date of attribute in FofbCommand and the loading date recorded in a attribute by FofbCommand",
)
xSpsIsLiberaControlled = attribute(
dtype=('DevBoolean',),
max_dim_x=128,
doc="This attribute is forwarded from Fofb-Manager",
)
zSpsIsLiberaControlled = attribute(
dtype=('DevBoolean',),
max_dim_x=128,
doc="This attribute is forwarded from Fofb-Manager",
)
xSpsIsOn = attribute(
dtype=('DevBoolean',),
max_dim_x=128,
doc="This attribute is forwarded from Fofb-Manager",
)
zSpsIsOn = attribute(
dtype=('DevBoolean',),
max_dim_x=128,
doc="This attribute is forwarded from Fofb-Manager",
)
bpmCnt = attribute(
dtype=('DevLong',),
max_dim_x=512,
doc="This attribute is forwarded from Fofb-Manager",
)
xInvRespMatrix = attribute(
dtype=(('DevDouble',),),
access=AttrWriteType.READ_WRITE,
max_dim_x=512, max_dim_y=512,
doc="This attribute is reshaped and forwarded to/from FofbCommand",
)
zInvRespMatrix = attribute(
dtype=(('DevDouble',),),
access=AttrWriteType.READ_WRITE,
max_dim_x=512, max_dim_y=512,
doc="This attribute is reshaped and forwarded to/from FofbCommand",
)
zFofbRunning = attribute(
name="zFofbRunning",
label="zFofbRunning",
forwarded=True
)
xFofbRunning = attribute(
name="xFofbRunning",
label="xFofbRunning",
forwarded=True
)
xRefOrbit = attribute(
name="xRefOrbit",
label="xRefOrbit",
forwarded=True
)
zRefOrbit = attribute(
name="zRefOrbit",
label="zRefOrbit",
forwarded=True
)
# ---------------
# General methods
# ---------------
def init_device(self):
"""Initialises the attributes and properties of the DG_PY_FOFBLegacy."""
Device.init_device(self)
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.init_device) ENABLED START -----#
self.set_state(tango.DevState.INIT)
try:
self.d_status.pop('init')
except KeyError:
pass
try:
self.prx_fofbcommand = tango.DeviceProxy(self.FofbCommand)
self.prx_fofbwatcher = tango.DeviceProxy(self.FofbWatcher)
self.prx_fofbmanager = tango.DeviceProxy(self.FofbManager)
except Exception as e:
self.d_status["init"] = "Error at init"
self.error_stream("Error at init:\n{}".format(str(e)))
self.set_state(tango.DevState.FAULT)
return
self.info_stream("Init done !")
self.set_state(tango.DevState.ON)
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.init_device
def always_executed_hook(self):
"""Method always executed before any TANGO command is executed."""
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.always_executed_hook) ENABLED START -----#
state = tango.DevState.ON
for n,p in zip(
(self.FofbCommand, self.FofbWatcher, self.FofbManager),
(self.prx_fofbcommand, self.prx_fofbwatcher, self.prx_fofbmanager)):
try:
try:
self.d_status.pop(n)
except KeyError:
pass
p.ping()
except tango.DevFailed as e:
self.error_stream("Cannot ping {}:\n{}".format(n, str(e)))
self.d_status[n]="Cannot ping {}".format(n)
state=tango.DevState.FAULT
self.set_state(state)
self.set_status(self.my_status())
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.always_executed_hook
def delete_device(self):
"""Hook to delete resources allocated in init_device.
This method allows for any memory or other resources allocated in the
init_device method to be released. This method is called by the device
destructor and by the device Init command.
"""
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.delete_device) ENABLED START -----#
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.delete_device
# ------------------
# Attributes methods
# ------------------
def read_xRefOrbitLoadedOnDevice(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.xRefOrbitLoadedOnDevice_read) ENABLED START -----#attr.set_value(self.attr_xRefOrbitLoadedOnDevice_read)
# Simply check that the attribute is not empty/zeroes
try:
attr = self.prx_fofbcommand["x_ref_orbit"]
except Exception:
return False
if len(attr.value) < 1:
return False
if np.all(attr.value == 0):
return False
return True
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.xRefOrbitLoadedOnDevice_read
def read_xRefOrbitLoadedOnBpms(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.xRefOrbitLoadedOnBpms_read) ENABLED START -----#attr.set_value(self.attr_xRefOrbitLoadedOnBpms_read)
# Use the loading time and attribute time
try:
attr_date = self.prx_fofbcommand["x_ref_orbit"].time.todatetime()
except Exception:
return False
load_date = datetime.datetime.strptime(self.prx_fofbcommand.last_x_ref_orbit_loading_time, "%Y-%m-%d %H:%M:%S")
return attr_date < load_date
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.xRefOrbitLoadedOnBpms_read
def read_zRefOrbitLoadedOnDevice(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.zRefOrbitLoadedOnDevice_read) ENABLED START -----#attr.set_value(self.attr_zRefOrbitLoadedOnDevice_read)
# Simply check that the attribute is not empty/zeroes
try:
attr = self.prx_fofbcommand["y_ref_orbit"]
except Exception:
return False
if len(attr.value) < 1:
return False
if np.all(attr.value == 0):
return False
return True
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.zRefOrbitLoadedOnDevice_read
def read_zRefOrbitLoadedOnBpms(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.zRefOrbitLoadedOnBpms_read) ENABLED START -----#attr.set_value(self.attr_zRefOrbitLoadedOnBpms_read)
# Use the loading time and attribute time
try:
attr_date = self.prx_fofbcommand["y_ref_orbit"].time.todatetime()
except Exception:
return False
load_date = datetime.datetime.strptime(self.prx_fofbcommand.last_y_ref_orbit_loading_time, "%Y-%m-%d %H:%M:%S")
return attr_date < load_date
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.zRefOrbitLoadedOnBpms_read
def read_xInvRespMatrixLoadedOnDevice(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.xInvRespMatrixLoadedOnDevice_read) ENABLED START -----#attr.set_value(self.attr_xInvRespMatrixLoadedOnDevice_read)
# Simply check that the attribute is not empty/zeroes
try:
# This throw a DevFailed when attribute empty, handle it
attr = self.prx_fofbcommand["x_inv_resp_mat"]
except Exception:
return False
if len(attr.value) < 1:
return False
if np.all(attr.value == 0):
return False
return True
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.xInvRespMatrixLoadedOnDevice_read
def read_xInvRespMatrixLoadedOnBpms(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.xInvRespMatrixLoadedOnBpms_read) ENABLED START -----#attr.set_value(self.attr_xInvRespMatrixLoadedOnBpms_read)
# Use the loading time and attribute time
try:
# This throw a DevFailed when attribute empty, handle it
attr_date = self.prx_fofbcommand["x_inv_resp_mat"].time.todatetime()
except Exception:
return False
load_date = datetime.datetime.strptime(self.prx_fofbcommand.last_x_inv_resp_mat_loading_time, "%Y-%m-%d %H:%M:%S")
return attr_date < load_date
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.xInvRespMatrixLoadedOnBpms_read
def read_zInvRespMatrixLoadedOnDevice(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.zInvRespMatrixLoadedOnDevice_read) ENABLED START -----#attr.set_value(self.attr_zInvRespMatrixLoadedOnDevice_read)
# Simply check that the attribute is not empty/zeroes
try:
# This throw a DevFailed when attribute empty, handle it
attr = self.prx_fofbcommand["y_inv_resp_mat"]
except Exception:
return False
if len(attr.value) < 1:
return False
if np.all(attr.value == 0):
return False
return True
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.zInvRespMatrixLoadedOnDevice_read
def read_zInvRespMatrixLoadedOnBpms(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.zInvRespMatrixLoadedOnBpms_read) ENABLED START -----#attr.set_value(self.attr_zInvRespMatrixLoadedOnBpms_read)
# Use the loading time and attribute time
try:
# This throw a DevFailed when attribute empty, handle it
attr_date = self.prx_fofbcommand["y_inv_resp_mat"].time.todatetime()
except Exception:
return False
load_date = datetime.datetime.strptime(self.prx_fofbcommand.last_y_inv_resp_mat_loading_time, "%Y-%m-%d %H:%M:%S")
return attr_date < load_date
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.zInvRespMatrixLoadedOnBpms_read
def read_xSpsIsLiberaControlled(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.xSpsIsLiberaControlled_read) ENABLED START -----#attr.set_value(self.attr_xSpsIsLiberaControlled_read)
try:
sps = self.prx_fofbmanager["xSpsIsLiberaControlled"].value
except Exception:
return [False,]
return sps
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.xSpsIsLiberaControlled_read
def read_zSpsIsLiberaControlled(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.zSpsIsLiberaControlled_read) ENABLED START -----#attr.set_value(self.attr_zSpsIsLiberaControlled_read)
try:
sps = self.prx_fofbmanager["zSpsIsLiberaControlled"].value
except Exception:
return [False,]
return sps
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.zSpsIsLiberaControlled_read
def read_xSpsIsOn(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.xSpsIsOn_read) ENABLED START -----#attr.set_value(self.attr_xSpsIsOn_read)
try:
sps = self.prx_fofbmanager["xSpsIsOn"].value
except Exception:
return [False,]
return sps
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.xSpsIsOn_read
def read_zSpsIsOn(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.zSpsIsOn_read) ENABLED START -----#attr.set_value(self.attr_zSpsIsOn_read)
try:
sps = self.prx_fofbmanager["zSpsIsOn"].value
except Exception:
return [False,]
return sps
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.zSpsIsOn_read
def read_bpmCnt(self):
# PROTECTED REGION ID(DG_PY_FOFBLegacy.bpmCnt_read) ENABLED START #
try:
bpmcnt = self.prx_fofbmanager["bpmcnt"].value
except Exception:
return [np.nan,]
return bpmcnt
# PROTECTED REGION END # // DG_PY_FOFBLegacy.bpmCnt_read
def read_xInvRespMatrix(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.xInvRespMatrix_read) ENABLED START -----#attr.set_value(self.attr_xInvRespMatrix_read)
# Read from FofbCommand, reshape before forwarding
try:
mat = self.prx_fofbcommand["x_inv_resp_mat"].value
self.debug_stream("Read x_inv_resp_mat from {} :\n{}".format(self.prx_fofbcommand.name(), str(mat)))
except Exception:
return np.nan*np.ones((1,1))
return mat[:,1:123]
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.xInvRespMatrix_read
def write_xInvRespMatrix(self, value):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.xInvRespMatrix_write) ENABLED START -----#
# Reshape then forward
try:
self.prx_fofbcommand["x_inv_resp_mat"] = np.hstack([np.zeros((50, 1)), value, np.zeros((50,5))]).astype(int)
except Exception:
pass
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.xInvRespMatrix_write
def read_zInvRespMatrix(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.zInvRespMatrix_read) ENABLED START -----#attr.set_value(self.attr_zInvRespMatrix_read)
# Read from FofbCommand, reshape before forwarding
try:
mat = self.prx_fofbcommand["y_inv_resp_mat"].value
self.debug_stream("Read y_inv_resp_mat from {} :\n{}".format(self.prx_fofbcommand.name(), str(mat)))
except Exception:
return np.nan*np.ones((1,1))
return mat[:,1:123]
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.zInvRespMatrix_read
def write_zInvRespMatrix(self, value):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.zInvRespMatrix_write) ENABLED START -----#
# Reshape then forward
try:
self.prx_fofbcommand["y_inv_resp_mat"] = np.hstack([np.zeros((50, 1)), value, np.zeros((50,5))]).astype(int)
except Exception:
pass
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.zInvRespMatrix_write
# --------
# Commands
# --------
@command(
)
@DebugIt()
def StopToZero(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.StopToZero) ENABLED START -----#
try:
self.prx_fofbcommand.StopToZeroFofb_x()
self.prx_fofbcommand.StopToZeroFofb_y()
except Exception:
self.error_stream("Failed to perform StopToZero()")
else:
self.info_stream("Performed StopToZero()")
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.StopToZero
@command(
)
@DebugIt()
def Stop(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.Stop) ENABLED START -----#
try:
self.prx_fofbcommand.StopFofb_x()
self.prx_fofbcommand.StopFofb_y()
except Exception:
self.error_stream("Failed to perform Stop()")
else:
self.info_stream("Performed Stop()")
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.Stop
@command(
)
@DebugIt()
def ColdStart(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.ColdStart) ENABLED START -----#
try:
if tango.AttributeProxy("ans/ca/service-locker-matlab/sofb").read().value:
self.warning_stream("ColdStart() not performed because SOFB is running")
self.d_status["start"] = "{} Start() blocked, SOFB is running.".format(datetime.datetime.now().strftime("%M%D-%H%M"))
return
self.StopToZero()
self.prx_fofbcommand.StartSteerers()
self.HotStart()
except Exception:
self.error_stream("Failed to perform ColdStart()")
self.d_status["start"] = "{} Start() failed.".format(datetime.datetime.now().strftime("%M%D-%H%M"))
else:
self.info_stream("Performed ColdStart()")
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.ColdStart
@command(
)
@DebugIt()
def HotStart(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.HotStart) ENABLED START -----#
try:
if tango.AttributeProxy("ans/ca/service-locker-matlab/sofb").read().value:
self.warning_stream("ColdStart() not performed because SOFB is running")
self.d_status["start"] = "{} Start() blocked, SOFB is running.".format(datetime.datetime.now().strftime("%M%D-%H%M"))
return
if not (self.xRefOrbitLoadedOnBpms and self.zRefOrbitLoadedOnDevice and self.xInvRespMatrixLoadedOnBpms and self.zInvRespMatrixLoadedOnDevice):
self.d_status["start"] = "{} Start() blocked, RefOrbit or InvMatrix not loaded.".format(datetime.datetime.now().strftime("%M%D-%H%M"))
self.warning_stream("Start() not performed because either RefOrbit or InvMatrix is not loaded.")
return
self.prx_fofbcommand.StartFofb_X()
self.prx_fofbcommand.StartFofb_Y()
except Exception:
self.d_status["start"] = "{} Start() failed.".format(datetime.datetime.now().strftime("%M%D-%H%M"))
self.error_stream("Failed to perform HotStart()")
else:
self.d_status["start"] = "{} Start() done.".format(datetime.datetime.now().strftime("%M%D-%H%M"))
self.info_stream("Performed HotStart()")
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.HotStart
@command(
)
@DebugIt()
def AcknowledgeError(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.AcknowledgeError) ENABLED START -----#
pass
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.AcknowledgeError
@command(
)
@DebugIt()
def StartStep04LoadXRefOrbit(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.StartStep04LoadXRefOrbit) ENABLED START -----#
try:
self.prx_fofbcommand.LoadRefOrbitX()
except Exception:
self.error_stream("Failed to LoadRefOrbitX()")
else:
self.info_stream("Performed LoadRefOrbitX()")
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.StartStep04LoadXRefOrbit
@command(
)
@DebugIt()
def StartStep05LoadZRefOrbit(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.StartStep05LoadZRefOrbit) ENABLED START -----#
try:
self.prx_fofbcommand.LoadRefOrbitY()
except Exception:
self.error_stream("Failed to LoadRefOrbitY()")
else:
self.info_stream("Performed LoadRefOrbitY()")
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.StartStep05LoadZRefOrbit
@command(
)
@DebugIt()
def StartStep06LoadXInvRespMatrix(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.StartStep06LoadXInvRespMatrix) ENABLED START -----#
try:
self.prx_fofbcommand.LoadInvRespMatrixX()
except Exception:
self.error_stream("Failed to LoadInvRespMatrixX()")
else:
self.info_stream("Performed LoadInvRespMatrixX()")
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.StartStep06LoadXInvRespMatrix
@command(
)
@DebugIt()
def StartStep07LoadZInvRespMatrix(self):
#----- PROTECTED REGION ID(DG_PY_FOFBLegacy.StartStep07LoadZInvRespMatrix) ENABLED START -----#
try:
self.prx_fofbcommand.LoadInvRespMatrixY()
except Exception:
self.error_stream("Failed to LoadInvRespMatrixY()")
else:
self.info_stream("Performed LoadInvRespMatrixY()")
#----- PROTECTED REGION END -----# // DG_PY_FOFBLegacy.StartStep07LoadZInvRespMatrix
# ----------
# Run server
# ----------
def main(args=None, **kwargs):
"""Main function of the DG_PY_FOFBLegacy module."""
# PROTECTED REGION ID(DG_PY_FOFBLegacy.main) ENABLED START #
return run((DG_PY_FOFBLegacy,), args=args, **kwargs)
# PROTECTED REGION END # // DG_PY_FOFBLegacy.main
if __name__ == '__main__':
main()
<?xml version="1.0" encoding="ASCII"?>
<pogoDsl:PogoSystem xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:pogoDsl="http://www.esrf.fr/tango/pogo/PogoDsl">
<classes name="DG_PY_FOFBLegacy" pogoRevision="9.6">
<description description="This device is used for backward compatibility for the new FOFB Control (FOFBWatcher and FOFBControl).&#xA;&#xA;It gives access to Attributes and Commands offered previously by FOFB-Manager" title="FOFBLegacy" sourcePath="/home/operateur/GrpDiagnostics/RBT/FOFB/dg_py_fofblegacy" language="PythonHL" filestogenerate="XMI file,Code files,Protected Regions" license="GPL" copyright="" hasMandatoryProperty="true" hasConcreteProperty="true" hasAbstractCommand="false" hasAbstractAttribute="false">
<inheritances classname="Device_Impl" sourcePath=""/>
<identification contact="at synchrotron-soleil.fr - romain.brones" author="romain.brones" emailDomain="synchrotron-soleil.fr" classFamily="Simulators" siteSpecific="" platform="Unix Like" bus="Not Applicable" manufacturer="none" reference=""/>
</description>
<deviceProperties name="FofbCommand" mandatory="true" description="Tango path to the FofbCommand device">
<type xsi:type="pogoDsl:StringType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</deviceProperties>
<deviceProperties name="FofbWatcher" mandatory="true" description="Tango path to the FofbWatcher device">
<type xsi:type="pogoDsl:StringType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</deviceProperties>
<deviceProperties name="FofbManager" mandatory="true" description="Tango path to the Fofb-Manager device.">
<type xsi:type="pogoDsl:StringType"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</deviceProperties>
<commands name="State" description="This command gets the device state (stored in its device_state data member) and returns it to the caller." execMethod="dev_state" displayLevel="OPERATOR" polledPeriod="0">
<argin description="none">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="Device state">
<type xsi:type="pogoDsl:StateType"/>
</argout>
<status abstract="true" inherited="true" concrete="true"/>
</commands>
<commands name="Status" description="This command gets the device status (stored in its device_status data member) and returns it to the caller." execMethod="dev_status" displayLevel="OPERATOR" polledPeriod="0">
<argin description="none">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="Device status">
<type xsi:type="pogoDsl:ConstStringType"/>
</argout>
<status abstract="true" inherited="true" concrete="true"/>
</commands>
<commands name="StopToZero" description="" execMethod="stop_to_zero" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="Stop" description="Forwarded to FofbCommand" execMethod="stop" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="ColdStart" description="This command is translated to:&#xA;* Check that SOFB is not running (-> Service-Locker-Matlab)&#xA;* Perform StopToZero (-> FofbLegacy)&#xA;* Switch on and set LiberaControl on steerers (-> FofbCommand)&#xA;* HotStart (-> FofbLegacy)&#xA;&#xA;If sequence is interrupted by a failed check, return and display a Warning log and status." execMethod="cold_start" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="HotStart" description="This command is translated to:&#xA;* Check that SOFB is not running (-> Service-Locker-Matlab)&#xA;* Check that RefOrbit and InvMatrix are loaded (-> Fofb-Legacy)&#xA;* Start (-> FofbCommand)&#xA;&#xA;If sequence is interrupted by a failed check, return and display a Warning log and status." execMethod="hot_start" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="AcknowledgeError" description="Forwarded to FofbCommand" execMethod="acknowledge_error" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="StartStep04LoadXRefOrbit" description="Forwarded to FofbCommand" execMethod="start_step04_load_xref_orbit" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="StartStep05LoadZRefOrbit" description="Forwarded to FofbCommand" execMethod="start_step05_load_zref_orbit" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="StartStep06LoadXInvRespMatrix" description="Forwarded to FofbCommand" execMethod="start_step06_load_xinv_resp_matrix" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<commands name="StartStep07LoadZInvRespMatrix" description="Forwarded to FofbCommand" execMethod="start_step07_load_zinv_resp_matrix" displayLevel="OPERATOR" polledPeriod="0" isDynamic="false">
<argin description="">
<type xsi:type="pogoDsl:VoidType"/>
</argin>
<argout description="">
<type xsi:type="pogoDsl:VoidType"/>
</argout>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</commands>
<attributes name="xRefOrbitLoadedOnDevice" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Simply check that the local attribute is not empty/zeros" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="xRefOrbitLoadedOnBpms" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Translated to checking the date of attribute in FofbCommand and the loading date recorded in a attribute by FofbCommand" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="zRefOrbitLoadedOnDevice" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Simply check that the local attribute is not empty/zeros" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="zRefOrbitLoadedOnBpms" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Translated to checking the date of attribute in FofbCommand and the loading date recorded in a attribute by FofbCommand" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="xInvRespMatrixLoadedOnDevice" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Simply check that the local attribute is not empty/zeros" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="xInvRespMatrixLoadedOnBpms" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Translated to checking the date of attribute in FofbCommand and the loading date recorded in a attribute by FofbCommand" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="zInvRespMatrixLoadedOnDevice" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Simply check that the local attribute is not empty/zeros" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="zInvRespMatrixLoadedOnBpms" attType="Scalar" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="Translated to checking the date of attribute in FofbCommand and the loading date recorded in a attribute by FofbCommand" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="xSpsIsLiberaControlled" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="128" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="This attribute is forwarded from Fofb-Manager" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="zSpsIsLiberaControlled" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="128" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="This attribute is forwarded from Fofb-Manager" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="xSpsIsOn" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="128" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="This attribute is forwarded from Fofb-Manager" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="zSpsIsOn" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="128" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:BooleanType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="This attribute is forwarded from Fofb-Manager" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="bpmCnt" attType="Spectrum" rwType="READ" displayLevel="OPERATOR" polledPeriod="0" maxX="512" maxY="" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:IntType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="This attribute is forwarded from Fofb-Manager" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="xInvRespMatrix" attType="Image" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="512" maxY="512" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="This attribute is reshaped and forwarded to/from FofbCommand" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<attributes name="zInvRespMatrix" attType="Image" rwType="READ_WRITE" displayLevel="OPERATOR" polledPeriod="0" maxX="512" maxY="512" allocReadMember="true" isDynamic="false">
<dataType xsi:type="pogoDsl:DoubleType"/>
<changeEvent fire="false" libCheckCriteria="false"/>
<archiveEvent fire="false" libCheckCriteria="false"/>
<dataReadyEvent fire="false" libCheckCriteria="true"/>
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
<properties description="This attribute is reshaped and forwarded to/from FofbCommand" label="" unit="" standardUnit="" displayUnit="" format="" maxValue="" minValue="" maxAlarm="" minAlarm="" maxWarning="" minWarning="" deltaTime="" deltaValue=""/>
</attributes>
<forwardedAttributes name="zFofbRunning" label="zFofbRunning">
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</forwardedAttributes>
<forwardedAttributes name="xFofbRunning" label="xFofbRunning">
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</forwardedAttributes>
<forwardedAttributes name="xRefOrbit" label="xRefOrbit">
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</forwardedAttributes>
<forwardedAttributes name="zRefOrbit" label="zRefOrbit">
<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
</forwardedAttributes>
<preferences docHome="../doc/doc_html" makefileHome="$(TANGO_HOME)"/>
</classes>
</pogoDsl:PogoSystem>
# DG_PY_FofbLegacy # DG_PY_FofbLegacy
## About this device
This device is used to offer a similar API to Matlab FOFB/SOFB scripts while moving the FOFB application to its new platform and control.
The new FOFB uses two main Tango devices: FofbCommand and FofbWatcher.
## Getting started The use of the previous device Fofb-Manager is fading, but some features are still used.
Command for the BPM dedicated network synchronization and start are used by expert.
The FofbLegacy also forward arrays of attributes that the Fofb-Manager collects: BpmCnt, SpsIsOn...
To make it easy for you to get started with GitLab, here's a list of recommended next steps. This device skeleton is generated with Pogo, in PythonHL mode.
When possible, forwarded attributes have been used.
Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
## Add your files ## Device overview
- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files ### Properties
- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
``` | Property Name | Description |
cd existing_repo | ------------- |-------------|
git remote add origin https://gitlab.synchrotron-soleil.fr/dg/ds_dg_pytango_package/dg_py_fofblegacy.git | FofbCommand | Tango path to the FofbCommand device |
git branch -M main | FofbWatcher | Tango path to the FofbWatcher device |
git push -uf origin main | FofbManager | Tango path to the Fofb-Manager device |
```
## Integrate with your tools ### Attributes
- [ ] [Set up project integrations](https://gitlab.synchrotron-soleil.fr/dg/ds_dg_pytango_package/dg_py_fofblegacy/-/settings/integrations) | Attribute Name | Type | Description |
| -------------- |------|-------------|
| [xz]RefOrbitLoadedOnDevice | Scalar Boolean RO | Simply check that the local attribute is not empty/zeros |
| [xz]RefOrbitLoadedOnBpms | Scalar Boolean RO | Translated to checking the date of attribute in FofbCommand and the loading date recorded in a attribute by FofbCommand |
| [xz]InvRespMatrixLoadedOnDevice | Scalar Boolean RO | Simply check that the local attribute is not empty/zeros |
| [xz]InvRespMatrixLoadedOnBpms | Scalar Boolean RO | Translated to checking the date of attribute in FofbCommand and the loading date recorded in a attribute by FofbCommand |
| [xz]SpsIsLiberaControlled | Spectrum Boolean RO | This attribute is forwarded from Fofb-Manager |
| [xz]SpsIsOn | Spectrum Boolean RO | This attribute is forwarded from Fofb-Manager |
| bpmCnt | Spectrum DevLong RO | This attribute is forwarded from Fofb-Manager |
| [xz]InvRespMatrix | Image DevDouble RW | This attribute is reshaped and forwarded to/from FofbCommand |
| [xz]FofbRunning | _Forwarded_ Scalar Boolean RO | Native Tango Forward (FofbWatcher) |
| [xz]RefOrbit | _Forwarded_ Spectrum DevLong RW | Native Tango Forward (FofbCommand) |
## Collaborate with your team ### Commands
- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) All commands take no argument and return nothing.
- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
## Test and Deploy | Command Name | Description |
| ------------ |-------------|
| StopToZero | Forwarded to FofbCommand |
| Stop | Forwarded to FofbCommand |
| ColdStart | This command is translated to:<br>- Check that SOFB is not running (-> Service-Locker-Matlab)<br>- Perform StopToZero (-> FofbLegacy)<br>- Switch on and set LiberaControl on steerers (-> FofbCommand)<br>- HotStart (-> FofbLegacy)<br><br>If sequence is interrupted by a failed check, return and display a Warning log and status.
| HotStart | This command is translated to:<br>- Check that SOFB is not running (-> Service-Locker-Matlab)<br>- Check that RefOrbit and InvMatrix are loaded (-> Fofb-Legacy)<br>- Start (-> FofbCommand)<br><br>If sequence is interrupted by a failed check, return and display a Warning log and status. |
| AcknowledgeError | Does nothing |
| StartStep0[45]Load[XY]RefOrbit | Forwarded to FofbCommand |
| StartStep0[67]Load[XY]InvRespMatrix | Forwarded to FofbCommand |
Use the built-in continuous integration in GitLab.
- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
***
# Editing this README
When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
## Suggestions for a good README
Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
## Name
Choose a self-explaining name for your project.
## Description
Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
## Badges
On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
## Visuals
Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
## Installation
Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
## Usage
Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
## Support
Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
## Roadmap
If you have ideas for releases in the future, it is a good idea to list them in the README.
## Contributing
State if you are open to contributions and what your requirements are for accepting them.
For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
## Authors and acknowledgment
Show your appreciation to those who have contributed to the project.
## License
For open source projects, say how it is licensed.
## Project status
If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment