Commit bf3610bb authored by Claes Sjofors's avatar Claes Sjofors

Operator window: new status bar and alarm time viewed

parent 3da6358f
......@@ -274,6 +274,13 @@ pushbuttons to iconify and delete the window. It is divided in tree parts, to th
current alarms and messages are viewed, in the middle there are pushbuttons for some base
functions, and to the left there are pushbuttons configured for this operator place.
<h2>Status bar
The top row is a status bar. It shows who is logged in on on which node. For tha current
node, and for all nodes that there are node supervision configured, an indicator for system
status is viewed. Green states that everything is all right, yellow indicates warning, red
error and flashing red fatal error. If you click on a node, the status graph for the node
is opened.
<h2>Alarms and messages
In the left part of the operator window alarm and messages are displayed.
......
src/doc/man/src/opg_fig6.png

17.8 KB | W: | H:

src/doc/man/src/opg_fig6.png

30.4 KB | W: | H:

src/doc/man/src/opg_fig6.png
src/doc/man/src/opg_fig6.png
src/doc/man/src/opg_fig6.png
src/doc/man/src/opg_fig6.png
  • 2-up
  • Swipe
  • Onion skin
......@@ -277,6 +277,13 @@ att ikonisera och ta bort f
larm och meddelanden, i mitten finns en meny och knappar för olika basfunktioner, och till
vänster knappar som är konfigurerade för just den här operatörsplatsen.
<h2>Statusfält
Den översta raden är ett statusfält. Här visas vem som är inloggad och på vilken nod. För
den aktuella noden, och för alla noder som det finns nod-övervakning på, visas en indikator
för nodens systemstatus. Grön innebär att allt fungerar som det ska, gult indikerar varning,
rött fel och blinkande rött fatalt fel. Om man klickar på en nod öppnas status-bilden för
noden.
<h2>Larm och meddelanden
I vänstra delen av operatörsfönstret visas larm och meddelanden.
......
......@@ -53,11 +53,11 @@ extern "C" {
return (((long int)(sts)?((*sts)=(lsts)):(EVEN(lsts)?(errh_Bugcheck(lsts, (str)),(lsts)):(lsts))),a)
#endif
#define errh_SeveritySuccess(sts) ((sts) & 7 == 3)
#define errh_SeverityInfo(sts) ((sts) & 7 == 1)
#define errh_SeverityWarning(sts) ((sts) & 7 == 0)
#define errh_SeverityError(sts) ((sts) & 7 == 2)
#define errh_SeverityFatal(sts) ((sts) & 7 == 4)
#define errh_SeveritySuccess(sts) (((sts) & 7) == 3)
#define errh_SeverityInfo(sts) (((sts) & 7) == 1)
#define errh_SeverityWarning(sts) (((sts) & 7) == 0)
#define errh_SeverityError(sts) (((sts) & 7) == 2)
#define errh_SeverityFatal(sts) (((sts) & 7) == 4)
typedef enum {
errh_eSeverity_Null,
......
......@@ -71,12 +71,13 @@ SObject pwrb:Class
EndBody
EndObject
!/**
! Only if the user has logged in to the operator system
! as this user he has authority to start this operator place.
! List of operator system users, separated by comma.
! Only if the user has logged in to the operator system as
! one of these user he has authority to start this operator place.
!*/
Object DedicatedOpsysUser $Attribute 29
Body SysBody
Attr TypeRef = "pwrs:Type-$String32"
Attr TypeRef = "pwrs:Type-$String256"
Attr Flags |= PWR_MASK_CONST
EndBody
EndObject
......
......@@ -65,7 +65,7 @@ SObject pwrb:Type
EndBody
EndObject
!/**
! Close button.
! Hide the Close button.
!*/
Object HideCloseButton $Bit
Body SysBody
......@@ -74,6 +74,26 @@ SObject pwrb:Type
Attr Value = 8
EndBody
EndObject
!/**
! Show the alarm time.
!*/
Object ShowAlarmTime $Bit
Body SysBody
Attr PgmName = "ShowAlarmTime"
Attr Text = "ShowAlarmTime"
Attr Value = 16
EndBody
EndObject
!/**
! Show the alarm time.
!*/
Object ShowAlarmDateAndTime $Bit
Body SysBody
Attr PgmName = "ShowAlarmDateAndTime"
Attr Text = "ShowAlarmDateAndTime"
Attr Value = 32
EndBody
EndObject
EndObject
EndSObject
......
......@@ -582,10 +582,25 @@ Xtt::Xtt( int *argc, char **argv[], int *return_sts) :
if ( EVEN(sts)) exit(sts);
if ( strcmp( opp->DedicatedOpsysUser, "") != 0) {
int duser_cnt;
char duser_array[10][40];
int found = 0;
sts = syi_UserName( opsys_user, sizeof(opsys_user));
if ( EVEN(sts)) exit(sts);
if ( strcmp( opp->DedicatedOpsysUser, opsys_user) != 0) {
duser_cnt = dcli_parse( opp->DedicatedOpsysUser, ",", "",
(char *) duser_array, sizeof( duser_array)/sizeof( duser_array[0]),
sizeof( duser_array[0]), 0);
for ( int i = 0; i < duser_cnt; i++) {
dcli_trim( duser_array[i], duser_array[i]);
if ( strcmp( duser_array[i], opsys_user) == 0) {
found = 1;
break;
}
}
if ( !found) {
printf( "Operator place is dedicated for another user\n");
exit(0);
}
......
This diff is collapsed.
......@@ -64,8 +64,10 @@ class OpGtk : public Op {
GtkWidget *appl_form;
GtkWidget *decr_button;
GtkWidget *tools_close;
GtkWidget *functions_close;
GtkWidget *funcbox[5];
GtkMenuBar *menu_bar;
GtkWidget *title_label;
int a_height;
int a_exist[5];
int a_active[5];
......@@ -80,6 +82,8 @@ class OpGtk : public Op {
int get_cmd( GtkWidget *w, char *cmd);
int create_menu_item( const char *name, int pixmap, int append, const char *cmd);
int delete_menu_item( const char *name);
void change_sup_color( void *imagew, op_eSupColor color);
void set_title( char *user);
static void activate_exit( GtkWidget *w, gpointer data);
static void activate_aalarm_ack( GtkWidget *w, gpointer data);
......@@ -104,6 +108,7 @@ class OpGtk : public Op {
static void activate_show_user( GtkWidget *w, gpointer data);
static void activate_logout( GtkWidget *w, gpointer data);
static void activate_cmd_menu_item( GtkWidget *w, gpointer data);
static void activate_sup_node( GtkWidget *w, gpointer data);
static void activate_graph( GtkWidget *w, gpointer data);
static void activate_appl1( GtkWidget *w, gpointer data);
static void activate_appl2( GtkWidget *w, gpointer data);
......
......@@ -1546,6 +1546,7 @@ int EvList::get_alarm_info( evlist_sAlarmInfo *info)
sizeof(info->a_alarm_text[0]));
strncpy( info->a_alarm_alias[a_cnt], object_item->alias,
sizeof(info->a_alarm_alias[0]));
info->a_alarm_time[a_cnt] = object_item->time;
info->a_alarm_active[a_cnt] = object_item->status & mh_mEventStatus_NotRet;
info->a_alarm_exist[a_cnt] = 1;
a_cnt++;
......@@ -1557,6 +1558,7 @@ int EvList::get_alarm_info( evlist_sAlarmInfo *info)
sizeof(info->b_alarm_text[0]));
strncpy( info->b_alarm_alias[b_cnt], object_item->alias,
sizeof(info->b_alarm_alias[0]));
info->b_alarm_time[b_cnt] = object_item->time;
info->b_alarm_active[b_cnt] = object_item->status & mh_mEventStatus_NotRet;
info->b_alarm_exist[b_cnt] = 1;
b_cnt++;
......@@ -1568,6 +1570,7 @@ int EvList::get_alarm_info( evlist_sAlarmInfo *info)
sizeof(info->c_alarm_text[0]));
strncpy( info->c_alarm_alias[c_cnt], object_item->alias,
sizeof(info->c_alarm_alias[0]));
info->c_alarm_time[c_cnt] = object_item->time;
info->c_alarm_active[c_cnt] = object_item->status & mh_mEventStatus_NotRet;
info->c_alarm_exist[c_cnt] = 1;
c_cnt++;
......@@ -1579,6 +1582,7 @@ int EvList::get_alarm_info( evlist_sAlarmInfo *info)
sizeof(info->d_alarm_text[0]));
strncpy( info->d_alarm_alias[d_cnt], object_item->alias,
sizeof(info->d_alarm_alias[0]));
info->d_alarm_time[d_cnt] = object_item->time;
info->d_alarm_active[d_cnt] = object_item->status & mh_mEventStatus_NotRet;
info->d_alarm_exist[d_cnt] = 1;
d_cnt++;
......@@ -1598,6 +1602,7 @@ int EvList::get_alarm_info( evlist_sAlarmInfo *info)
sizeof(info->i_alarm_text[0]));
strncpy( info->i_alarm_alias[i_cnt], object_item->alias,
sizeof(info->i_alarm_alias[0]));
info->i_alarm_time[i_cnt] = object_item->time;
info->i_alarm_active[i_cnt] = object_item->status & mh_mEventStatus_NotRet;
info->i_alarm_exist[i_cnt] = 1;
i_cnt++;
......
......@@ -60,22 +60,27 @@ class ItemAlarm;
typedef struct {
char a_alarm_text[ALARM_INFO_A_SIZE][80];
char a_alarm_alias[ALARM_INFO_A_SIZE][40];
pwr_tTime a_alarm_time[ALARM_INFO_A_SIZE];
int a_alarm_active[ALARM_INFO_A_SIZE];
int a_alarm_exist[ALARM_INFO_A_SIZE];
char b_alarm_text[ALARM_INFO_B_SIZE][80];
char b_alarm_alias[ALARM_INFO_A_SIZE][40];
pwr_tTime b_alarm_time[ALARM_INFO_B_SIZE];
int b_alarm_active[ALARM_INFO_B_SIZE];
int b_alarm_exist[ALARM_INFO_B_SIZE];
char c_alarm_text[ALARM_INFO_C_SIZE][80];
char c_alarm_alias[ALARM_INFO_A_SIZE][40];
pwr_tTime c_alarm_time[ALARM_INFO_C_SIZE];
int c_alarm_active[ALARM_INFO_C_SIZE];
int c_alarm_exist[ALARM_INFO_C_SIZE];
char d_alarm_text[ALARM_INFO_D_SIZE][80];
char d_alarm_alias[ALARM_INFO_A_SIZE][40];
pwr_tTime d_alarm_time[ALARM_INFO_D_SIZE];
int d_alarm_active[ALARM_INFO_D_SIZE];
int d_alarm_exist[ALARM_INFO_D_SIZE];
char i_alarm_text[ALARM_INFO_I_SIZE][80];
char i_alarm_alias[ALARM_INFO_A_SIZE][40];
pwr_tTime i_alarm_time[ALARM_INFO_I_SIZE];
int i_alarm_active[ALARM_INFO_I_SIZE];
int i_alarm_exist[ALARM_INFO_I_SIZE];
int alarms_total;
......
......@@ -26,6 +26,7 @@
#include "co_cdh.h"
#include "co_time.h"
#include "co_syi.h"
#include "pwr_baseclasses.h"
#include "rt_gdh.h"
#include "rt_mh.h"
......@@ -46,8 +47,9 @@ Op::Op( void *op_parent_ctx,
pwr_tStatus *status) :
parent_ctx(op_parent_ctx), start_jop(0),
jop(NULL), command_cb(NULL), map_cb(NULL), help_cb(NULL),
close_cb(NULL), get_alarm_info_cb(NULL), ack_last_cb(NULL)
close_cb(NULL), get_alarm_info_cb(NULL), ack_last_cb(NULL), sup_timerid(0)
{
sup_init();
}
......@@ -203,6 +205,20 @@ void Op::activate_cmd_menu_item( char *cmd)
command_cb( parent_ctx, cmd);
}
void Op::activate_sup_node( void *id)
{
pwr_tCmd cmd;
for ( unsigned int i = 0; i < sup_vect.size(); i++) {
if ( sup_vect[i].buttonw == id) {
sprintf( cmd, "open graph/class/inst=%s", sup_vect[i].object_name);
if ( command_cb)
command_cb( parent_ctx, cmd);
break;
}
}
}
void Op::activate_help()
{
if ( help_cb)
......@@ -230,3 +246,103 @@ void Op::jop_command_cb( void *op, char *command)
if ( ((Op *)op)->command_cb)
((Op *)op)->command_cb( ((Op *)op)->parent_ctx, command);
}
int Op::sup_init()
{
pwr_tOid node_oid;
pwr_tOid sup_oid;
pwr_tAName aname;
pwr_tStatus sts;
// Index 0 is current node
sts = gdh_GetNodeObject( 0, &node_oid);
if ( EVEN(sts)) return sts;
OpSup sup;
sup.node_oid = node_oid;
sts = gdh_ObjidToName( node_oid, sup.object_name, sizeof(sup.object_name), cdh_mName_volumeStrict);
if ( EVEN(sts)) return sts;
strcpy( aname, sup.object_name);
strcat( aname, ".SystemStatus");
sts = gdh_RefObjectInfo( aname, (void **)&sup.p, &sup.refid, sizeof(pwr_tStatus));
if ( EVEN(sts)) return sts;
syi_NodeName( &sts, sup.node_name, sizeof(sup.node_name));
sup_vect.push_back(sup);
// Add nodes in NodeLinkSup objects
for ( sts = gdh_GetClassList( pwr_cClass_NodeLinkSup, &sup_oid);
ODD(sts);
sts = gdh_GetNextObject( sup_oid, &sup_oid)) {
pwr_sClass_NodeLinkSup *sup_p;
qcom_sNode qnode;
pwr_tNid nid;
sts = gdh_ObjidToPointer( sup_oid, (void **)&sup_p);
OpSup nsup;
nsup.node_oid = sup_p->Node;
sts = gdh_ObjidToName( nsup.node_oid, nsup.object_name, sizeof(nsup.object_name),
cdh_mName_volumeStrict);
if ( EVEN(sts)) strcpy( nsup.object_name, "");
sts = gdh_ObjidToName( sup_oid, aname, sizeof(aname), cdh_mName_volumeStrict);
if ( EVEN(sts)) return sts;
strcat( aname, ".SystemStatus");
sts = gdh_RefObjectInfo( aname, (void **)&nsup.p, &sup.refid, sizeof(pwr_tStatus));
if ( EVEN(sts)) return sts;
int found = 0;
for (nid = qcom_cNNid; qcom_NextNode(&sts, &qnode, nid); nid = qnode.nid) {
if ( qnode.nid == nsup.node_oid.vid) {
strcpy( nsup.node_name, qnode.name);
found = 1;
break;
}
}
if ( !found)
strcpy( nsup.node_name, "Unknown");
sup_vect.push_back(nsup);
}
return 1;
}
void Op::sup_scan( void *data)
{
Op *op = (Op *) data;
int time = 1000;
for ( unsigned int i = 0; i < op->sup_vect.size(); i++) {
op_eSupColor color;
pwr_tStatus status = *op->sup_vect[i].p;
if ( status == 0)
color = op_eSupColor_Gray;
else if ( errh_SeveritySuccess( status) || errh_SeverityInfo( status))
color = op_eSupColor_Green;
else if ( errh_SeverityWarning( status))
color = op_eSupColor_Yellow;
else if ( errh_SeverityError( status))
color = op_eSupColor_Red;
else if ( errh_SeverityFatal( status)) {
if ( op->sup_vect[i].old_color == op_eSupColor_Red)
color = op_eSupColor_Black;
else
color = op_eSupColor_Red;
}
if ( color != op->sup_vect[i].old_color) {
op->sup_vect[i].old_color = color;
op->change_sup_color( op->sup_vect[i].imagew, color);
}
}
op->sup_timerid->add( time, sup_scan, op);
}
......@@ -22,6 +22,8 @@
/* xtt_op.h -- Operator window in xtt */
#include <vector>
#ifndef pwr_h
# include "pwr.h"
#endif
......@@ -38,7 +40,35 @@
# include "xtt_evlist.h"
#endif
using namespace std;
class CoWow;
class CoWowTimer;
class Op;
typedef enum {
op_eSupColor_Gray,
op_eSupColor_Green,
op_eSupColor_Yellow,
op_eSupColor_Red,
op_eSupColor_Black
} op_eSupColor;
class OpSup {
public:
OpSup() : buttonw(0), imagew(0), p(0), old_color(op_eSupColor_Gray), flash(0)
{ strcpy( node_name, ""); strcpy( object_name, "");}
pwr_tOid node_oid;
pwr_tOName object_name;
pwr_tObjName node_name;
void *buttonw;
void *imagew;
pwr_tStatus *p;
pwr_tRefId refid;
op_eSupColor old_color;
int flash;
};
class Op {
public:
......@@ -57,6 +87,9 @@ class Op {
int (*get_alarm_info_cb)( void *, evlist_sAlarmInfo *);
void (*ack_last_cb)( void *, unsigned long, unsigned long);
CoWow *wow;
pwr_tMask layout_mask;
vector<OpSup> sup_vect;
CoWowTimer *sup_timerid;
Op( void *op_parent_ctx,
char *opplace,
......@@ -69,11 +102,14 @@ class Op {
virtual void add_close_button() {}
virtual int create_menu_item( const char *name, int pixmap, int append, const char *cmd) { return 0;}
virtual int delete_menu_item( const char *name) { return 0;}
virtual void change_sup_color( void *imagew, op_eSupColor color) {}
virtual void set_title( char *user) {}
void set_jop_qid( int qix) { if ( jop) jop->set_jop_qid( qix);};
void scan();
int appl_action( int idx);
int jop_command( char *command);
int sup_init();
void activate_exit();
void activate_aalarm_ack();
void activate_balarm_ack();
......@@ -94,8 +130,10 @@ class Op {
void activate_show_user();
void activate_logout();
void activate_cmd_menu_item( char *cmd);
void activate_sup_node( void *id);
static void jop_command_cb( void *op, char *command);
static void sup_scan( void *data);
};
#endif
......@@ -24,6 +24,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <vector>
#include "co_nav_help.h"
#include "pwr_privilege.h"
......@@ -3436,6 +3437,10 @@ int XNav::login_from_opplace()
strcpy( user, username);
strcpy( base_user, username);
priv = base_priv = privilege;
if (op)
op->set_title( user);
return XNAV__SUCCESS;
}
......
......@@ -565,6 +565,8 @@ static void xnav_login_success_bc( void *ctx)
sprintf( msg, "User %s logged in", xnav->user);
xnav->cologin = 0;
xnav->message('I', msg);
if ( xnav->op)
xnav->op->set_title( xnav->user);
}
static void xnav_login_cancel_bc(void *xnav)
......@@ -611,6 +613,8 @@ static int xnav_login_func( void *client_data,
xnav->priv = priv;
sprintf( msg, "User %s logged in", arg1_str);
xnav->message('I', msg);
if ( xnav->op)
xnav->op->set_title( xnav->user);
}
return sts;
}
......@@ -637,6 +641,8 @@ static int xnav_logout_func( void *client_data,
}
strcpy( xnav->user, xnav->base_user);
xnav->priv = xnav->base_priv;
if ( xnav->op)
xnav->op->set_title( xnav->user);
return 1;
}
......@@ -2817,6 +2823,7 @@ static int xnav_open_func( void *client_data,
if ( closebutton)
xnav->op->add_close_button();
strcpy( xnav->opplace_name, opplace_str);
xnav->op->set_title( xnav->user);
// Load eventlist
if ( xnav->ev) {
......
......@@ -261,6 +261,7 @@ E 1.13.26 "_User"
E 1.13.27 "S_witch User"
E 1.13.28 "_Show User"
E 1.13.29 "_Return"
E 1.13.30 " on "
#
# Postscript printing
E 2.1.1 "Contents"
......
......@@ -261,6 +261,7 @@ E 1.13.26 "_Anv
E 1.13.27 "_Byt Anvndare"
E 1.13.28 "_Visa Anvndare"
E 1.13.29 "_terg"
E 1.13.30 " p "
#
# Postscript printing
E 2.1.1 "Innehll"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment