Skip to content
Snippets Groups Projects
Commit 1d69d654 authored by Antonin Hottois's avatar Antonin Hottois Committed by Antonin Hottois
Browse files

Added changelog and doc, formating changes

parent 34e83245
No related branches found
No related tags found
No related merge requests found
Showing
with 479 additions and 607 deletions
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
<attribute name="test" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>
......@@ -3,4 +3,8 @@ target/
.project
Antonin/
*.log
deserver/
\ No newline at end of file
dserver/
.project
Gestion_des_erreurs.docx
~$stion_des_erreurs.docx
.classpath
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>MessageTrigger</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>
## [1.0.5] - 23/06/2020
### This version is the result of actual tests within RCM1
### Most changes are the result of an overhaul of the error handling system.
### Changed
- Start/Stop commands are now expert level.
- Monitoring task is now started at init.
- Parser sub-devices being in Alarm mode no longer stop the monitoring task.
- Parser sub-devices not answering no longer stop the monitoring task.
- Changed jar output name to match SOLEIL standards.
- Changed package name to match SOLEIL standards.
- Modified README.MD.
### Added
- Device is now in ALARM mode when Parser sub-devices are not answering.
- Added Changelog.
- Added pom_fat_jar.xml to generate a jar with dependencies.
- Added MessageTrigger scripts to use the jar without dependencies within the control network.
## [1.0.4] - 22/06/2020
### This version was not committed, it was developed during the tests within RCM1
## [1.0.3] - 11/05/2020
### Changed
- LastStates are now initialized with the actual states at init, so that no message is sent during init.
- Changed the way "MessageList" property is parsed
### Added
- Commented the code
### Removed
- Removed "LastRecordedState" property, as it is useless in this new MessageTrigger.
## [1.0.2] - 07/06/2020
### Overhauled the whole communication system with TangoParsers, allowing for monitoring of several parsers at the same time.
### Removed
- Removed "TangoParserProxy" property, as it is no longer necessary
## [1.0.1] - 30/04/2020
### First version of the device
\ No newline at end of file
File added
......@@ -34,7 +34,7 @@ MAIN_CLASS=fr.soleil.tango.server.messagetrigger.MessageTrigger
DEVICE_ROOT_JAVA=$(dirname $0)
CLASSPATH=
CLASSPATH=$CLASSPATH:$DEVICE_ROOT_JAVA/MessageTrigger-1.0.5.jar
CLASSPATH=$CLASSPATH:$DEVICE_ROOT_JAVA/fr.soleil.deviceservers-MessageTrigger-1.0.5.jar
CLASSPATH=$CLASSPATH:$DEVICE_ROOT_JAVA/org.tango-controls-JTangoServer-9.5.19.jar
CLASSPATH=$CLASSPATH:$DEVICE_ROOT_JAVA/org.tango-controls-TangORB-9.5.19.jar
CLASSPATH=$CLASSPATH:$DEVICE_ROOT_JAVA/org.tango-controls-JTangoClientLang-9.5.19.jar
......
......@@ -37,7 +37,7 @@ set MAIN_CLASS=fr.soleil.tango.server.messagetrigger.MessageTrigger
:: generalement \\DeviceServers\java\
set DEVICE_ROOT_JAVA=%~dp0%
set CLASSPATH=%CLASSPATH%;%DEVICE_ROOT_JAVA%/MessageTrigger-1.0.5.jar
set CLASSPATH=%CLASSPATH%;%DEVICE_ROOT_JAVA%/fr.soleil.deviceservers-MessageTrigger-1.0.5.jar
set CLASSPATH=%CLASSPATH%;%DEVICE_ROOT_JAVA%/org.tango-controls-JTangoServer-9.5.19.jar
set CLASSPATH=%CLASSPATH%;%DEVICE_ROOT_JAVA%/org.tango-controls-TangORB-9.5.19.jar
set CLASSPATH=%CLASSPATH%;%DEVICE_ROOT_JAVA%/org.tango-controls-JTangoClientLang-9.5.19.jar
......
<?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="Test" pogoRevision="9.5">
<description description="" title="" sourcePath="./" language="Java" filestogenerate="XMI file,Code files,Protected Regions" license="?" copyright="" hasMandatoryProperty="false" hasConcreteProperty="false" hasAbstractCommand="false" hasAbstractAttribute="false">
<inheritances classname="Device_Impl" sourcePath=""/>
<identification contact="hottois@synchrotron-soleil.fr" author="Antonin Hottois" emailDomain="" classFamily="DeviceServer" siteSpecific="?" platform="All" bus="?" manufacturer="none" reference=""/>
</description>
<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>
<preferences docHome="./docs" makefileHome="$(TANGO_HOME)"/>
</classes>
</pogoDsl:PogoSystem>
\ No newline at end of file
# Welcome to Tango-Controls server MessageTrigger
Clone this repo and build single executable jar with dependencies using maven:
Clone this repo and build an executable jar with dependencies using maven:
```bash
$> mvn package -f pom_fat_jar.xml
......@@ -10,7 +10,7 @@ $> mvn package -f pom_fat_jar.xml
Run the server:
```bash
$> java -jar target/MessageTrigger-1.0.3.jar
$> java -jar target/MessageTrigger-1.0.5-jar-with-dependencies.jar
```
......
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>MessageTrigger</title>
</head>
<body>
<h1>Welcome to MessageTrigger</h1>
<p>
If you are using GitHub you may want to set up your repository to render this documentation using GitHub pages. For this, in your repository go to settings and activate GitHub pages.
</p>
</body>
</html>
\ No newline at end of file
......@@ -47,7 +47,7 @@
</dependencies>
<build>
<finalName>fr.soleil.deviceservers-MessageTrigger-${version}-jar-with-dependencies</finalName>
<finalName>MessageTrigger-${version}-jar-with-dependencies</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
......
......@@ -268,7 +268,7 @@ public class MessageTrigger implements StateUpdates{
}
@Command(inTypeDesc = "Clear the list of messages")
@StateMachine(deniedStates = { DeviceState.FAULT, DeviceState.ALARM})
@StateMachine(deniedStates = { DeviceState.FAULT})
public void ClearMessagesList()
{
m_message_array.clear_messages();
......@@ -278,6 +278,7 @@ public class MessageTrigger implements StateUpdates{
// METHODS
//-----------------------------------------------------------------------------------------
// FAULT: fatal error: stops the trigger task, lock the device in FAULT state, log the error.
@Override
public void send_fault(DevFailed e, String desc) {
if(m_trigger_task!=null) m_trigger_task.stop();
......@@ -285,9 +286,10 @@ public class MessageTrigger implements StateUpdates{
logger.error(DevFailedUtils.toString(e));
setState(DeviceState.FAULT);
setStatus("FAULT: " + desc); // +"\n\n"+DevFailedUtils.toString(e));
setStatus("FAULT: " + desc + "\n" + "Use init to restart"); // +"\n\n"+DevFailedUtils.toString(e));
}
// ALARM: warning: logs the error and set the device in ALARM state.
@Override
public void send_alarm(DevFailed e, String desc) {
logger.warn(desc,e);
......@@ -297,18 +299,17 @@ public class MessageTrigger implements StateUpdates{
setStatus("ALARM: " + desc);
}
// INFO: update status and log the event
@Override
public void send_info(String desc) {
logger.info(desc);
setStatus("INFO: " + desc+ "\n\n" +getStatus());
}
// Reset the status
@Override
public void clean_status() {
setState(DeviceState.ON);
setStatus(m_monitored_attributes_string);
}
}
\ No newline at end of file
......@@ -27,6 +27,7 @@ final public class TriggerPulserTask extends TimerTask {
// Variables for temporary stockage
private String tmp_message;
private DevState tmp_state;
private boolean is_status_clean;
//-----------------------------------------------------------------------------------------
// Constructor
......@@ -44,6 +45,7 @@ final public class TriggerPulserTask extends TimerTask {
m_error_handler = error_handler;
m_message_list = message_list;
m_monitored_devices = monitored_devices;
is_status_clean = false;
// Starting polling
m_timer = new Timer();
......@@ -67,8 +69,13 @@ final public class TriggerPulserTask extends TimerTask {
@Override
public void run() {
// Reseting status:
// If status is not clean
if(!is_status_clean)
{
// Reset status
m_error_handler.clean_status();
is_status_clean = true;
}
//-----------------------------------------------------------------------------------------
// Checking text talker state
......@@ -80,12 +87,14 @@ final public class TriggerPulserTask extends TimerTask {
catch (DevFailed e)
{
m_error_handler.send_fault(e, "Cannot reach text talker");
is_status_clean = false;
return;
}
if(tmp_state == DevState.FAULT || tmp_state == DevState.ALARM)
{
m_error_handler.send_fault(DevFailedUtils.newDevFailed( "Text Talker Device is not in a valid state!"),
"Text Talker Device is in " + tmp_state.toString() + " state!\n");
"Text Talker Device is in " + tmp_state.toString() + " state!");
is_status_clean = false;
return;
}
......@@ -102,6 +111,7 @@ final public class TriggerPulserTask extends TimerTask {
catch (DevFailed e)
{
m_error_handler.send_alarm(e, "Cannot reach monitored device "+ device_name+"!");
is_status_clean = false;
return;
}
......@@ -111,12 +121,14 @@ final public class TriggerPulserTask extends TimerTask {
m_error_handler.send_fault(DevFailedUtils.newDevFailed( "Monitored Device is not in a valid state!"),
"Monitored device is in " + tmp_state.toString() + " state!\n"+
"Device: " + device_name);
is_status_clean = false;
return;
}
if(tmp_state == DevState.ALARM)
{
m_error_handler.send_info("Monitored device " + device_name + " is in " + tmp_state.toString() + " state.");
is_status_clean = false;
}
}
......@@ -133,6 +145,7 @@ final public class TriggerPulserTask extends TimerTask {
catch (DevFailed e)
{
m_error_handler.send_fault(e, "Cannot check attribute " + m_monitored_attributes_list.get(i).get_name());
is_status_clean = false;
return;
}
......@@ -146,10 +159,12 @@ final public class TriggerPulserTask extends TimerTask {
m_message_list.push_message(tmp_message);
m_error_handler.send_info( "Detected update on attribute: " + m_monitored_attributes_list.get(i).get_name()+"\n"+
"Sent message: " + tmp_message);
is_status_clean = false;
}
catch (DevFailed e)
{
m_error_handler.send_fault(e, "Cannot write message on Text Talker");
is_status_clean = false;
return;
}
}
......
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<property name="pattern" value="%-5level %d [%thread - %X{deviceName}] %logger{36}.%M:%L - %msg%n"/>
<!-- this appender accepts only error messages and sends them to System.err -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<Target>System.err</Target>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<encoder>
<pattern>${pattern}</pattern>
</encoder>
</appender>
<appender name="CONSOLE-REQUEST" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>REQUEST %d [%X{deviceName}] - %msg%n</pattern>
</encoder>
</appender>
<!-- This appender splits logs by device-->
<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<Key>deviceName</Key>
<DefaultValue>UNKNOWN_DEVICE_NAME</DefaultValue>
</discriminator>
<sift>
<appender name="FILE-${deviceName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${deviceName}.log</file>
<Append>true</Append>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${deviceName}%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
<encoder>
<pattern>${pattern}</pattern>
</encoder>
</appender>
</sift>
</appender>
<!-- Write files asynchronously -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="SIFT"/>
</appender>
<logger name="org.jacorb" level="OFF" />
<logger name="org.tango" level="ERROR" />
<logger name="org.quartz" level="OFF" />
<logger name="net.sf.ehcache" level="OFF"/>
<logger name="ch.qos.logback" level="OFF"/>
<logger name="TangoClientRequests" level="OFF" additivity="false">
<appender-ref ref="CONSOLE-REQUEST" />
</logger>
<root level="DEBUG">
<appender-ref ref="CONSOLE" />
<appender-ref ref="ASYNC" />
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-5level %d [%thread - %X{deviceName}] %logger{36}.%M:%L - %msg%n</pattern>
</encoder>
</appender>
<appender name="CONSOLE-REQUEST" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>REQUEST %d [%X{deviceName}] - %msg%n</pattern>
</encoder>
</appender>
<logger name="org.jacorb" level="OFF" />
<logger name="org.tango" level="ERROR" />
<logger name="org.quartz" level="OFF" />
<logger name="net.sf.ehcache" level="OFF"/>
<logger name="ch.qos.logback" level="OFF"/>
<logger name="TangoClientRequests" level="OFF" additivity="false">
<appender-ref ref="CONSOLE-REQUEST" />
</logger>
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment