Commit 2889b888 authored by Claes Sjofors's avatar Claes Sjofors

SevHist, several sevhist curves in one window, sev plotgroups and plotgroup menu items in sev_xtt

parent 60dd39e9
...@@ -202,19 +202,13 @@ void XttTblGtk::activate_list_layout( GtkWidget *w, gpointer data) ...@@ -202,19 +202,13 @@ void XttTblGtk::activate_list_layout( GtkWidget *w, gpointer data)
xtt->tblnav->show_list(); xtt->tblnav->show_list();
} }
XttSevHist *XttTblGtk::sevhist_new( pwr_tOid oid, char *aname, bool sevhistobject) XttSevHist *XttTblGtk::sevhist_new( pwr_tOid *oidv, pwr_tOName *anamev, pwr_tOName *onamev, bool *sevhistobjectv)
{ {
GtkWidget *w; GtkWidget *w;
pwr_tStatus sts; pwr_tStatus sts;
pwr_tOid oidv[2];
pwr_tOName anamev[2];
oidv[0] = oid; return new XttSevHistGtk( (void *)this, toplevel, "SevHist", &w, oidv, anamev, onamev,
oidv[1] = pwr_cNOid; sevhistobjectv, sevcli, &sts);
strncpy( anamev[0], aname, sizeof(anamev[0]));
return new XttSevHistGtk( (void *)this, toplevel, "SevHist", &w, oidv, anamev,
sevcli, &sts, sevhistobject);
} }
CoLogin *XttTblGtk::login_new( const char *name, CoLogin *XttTblGtk::login_new( const char *name,
...@@ -487,6 +481,7 @@ XttTblGtk::XttTblGtk( GtkWidget *a_parent_wid, ...@@ -487,6 +481,7 @@ XttTblGtk::XttTblGtk( GtkWidget *a_parent_wid,
itemlist, item_cnt, &brow_widget, &sts); itemlist, item_cnt, &brow_widget, &sts);
tblnav->message_cb = &XttTbl::message; tblnav->message_cb = &XttTbl::message;
tblnav->is_authorized_cb = &XttTbl::is_authorized; tblnav->is_authorized_cb = &XttTbl::is_authorized;
tblnav->command_cb = &XttTbl::command_cb;
gtk_box_pack_start( GTK_BOX(vbox), GTK_WIDGET(menu_bar), FALSE, FALSE, 0); gtk_box_pack_start( GTK_BOX(vbox), GTK_WIDGET(menu_bar), FALSE, FALSE, 0);
gtk_box_pack_start( GTK_BOX(vbox), GTK_WIDGET(tools), FALSE, FALSE, 0); gtk_box_pack_start( GTK_BOX(vbox), GTK_WIDGET(tools), FALSE, FALSE, 0);
......
...@@ -49,7 +49,7 @@ class XttTblGtk : public XttTbl { ...@@ -49,7 +49,7 @@ class XttTblGtk : public XttTbl {
CoWowEntryGtk *cmd_entry; CoWowEntryGtk *cmd_entry;
void message( char severity, char *message); void message( char severity, char *message);
XttSevHist *sevhist_new( pwr_tOid oid, char *aname, bool sevhistobject); XttSevHist *sevhist_new( pwr_tOid *oidv, pwr_tOName *anamev, pwr_tOName *onamev, bool *sevhistobjectv);
CoLogin *login_new( const char *wl_name, CoLogin *login_new( const char *wl_name,
const char *wl_groupname, const char *wl_groupname,
void (* wl_bc_success)( void *), void (* wl_bc_success)( void *),
......
...@@ -77,6 +77,11 @@ void XttTbl::message( void *xtttbl, char severity, const char *message) ...@@ -77,6 +77,11 @@ void XttTbl::message( void *xtttbl, char severity, const char *message)
((XttTbl *)xtttbl)->message( severity, message); ((XttTbl *)xtttbl)->message( severity, message);
} }
int XttTbl::command_cb( void *ctx, char *cmd)
{
return ((XttTbl *)ctx)->command( cmd);
}
int XttTbl::is_authorized( void *ctx, unsigned int access, int msg) int XttTbl::is_authorized( void *ctx, unsigned int access, int msg)
{ {
return ((XttTbl *)ctx)->is_authorized( access, msg); return ((XttTbl *)ctx)->is_authorized( access, msg);
...@@ -120,29 +125,48 @@ void XttTbl::activate_print() ...@@ -120,29 +125,48 @@ void XttTbl::activate_print()
void XttTbl::activate_opensevhist() void XttTbl::activate_opensevhist()
{ {
// sevcli_sHistItem *hi; ItemBase *item;
TblNav_sevhistobject *hi;
if ( !tblnav->get_select( &hi)) { if ( !tblnav->get_select( &item)) {
message( 'E', "Select an storage item"); message( 'E', "Select an storage item");
return; return;
} }
bool sevhistobject = hi->attrnum > 1; switch ( item->type) {
if( !sevhistobject ) { case tblnav_eItemType_Local:
sevhist_new( hi->oid, hi->objectattrlist[0].aname, sevhistobject); case tblnav_eItemType_TreeLocal: {
} TblNav_sevhistobject *hi = &((ItemLocal *)item)->item;
else { pwr_tOid oidv[2] = { hi->oid, pwr_cNOid};
char *s; pwr_tOName anamev[2];
pwr_tAName aname; pwr_tOName onamev[2] = {"", ""};
s = strchr( hi->oname, '.'); bool sevhistobjectv[2] = {hi->attrnum > 1, false};
if ( !s) { if( !sevhistobjectv[0] ) {
//It is a complete object strcpy( anamev[0], hi->objectattrlist[0].aname);
aname[0] = '\0'; sevhist_new( oidv, anamev, onamev, sevhistobjectv);
} }
else { else {
strcpy( aname, s+1); char *s;
pwr_tAName aname;
s = strchr( hi->oname, '.');
if ( !s) {
//It is a complete object
aname[0] = '\0';
}
else {
strcpy( aname, s+1);
}
strcpy( anamev[0], aname);
sevhist_new( oidv, anamev, onamev, sevhistobjectv);
} }
sevhist_new( hi->oid, aname, sevhistobject); break;
}
case tblnav_eItemType_TreeCommand: {
ItemTreeCommand *ci = (ItemTreeCommand *)item;
command( ci->item.command);
break;
}
default: ;
} }
} }
...@@ -167,13 +191,20 @@ void XttTbl::delete_item_yes( void *ctx, void *data) ...@@ -167,13 +191,20 @@ void XttTbl::delete_item_yes( void *ctx, void *data)
void XttTbl::activate_delete_item() void XttTbl::activate_delete_item()
{ {
//sevcli_sHistItem *hi; //sevcli_sHistItem *hi;
ItemBase *item;
TblNav_sevhistobject *hi; TblNav_sevhistobject *hi;
char msg[300]; char msg[300];
if ( !tblnav->get_select( &hi)) { if ( !tblnav->get_select( &item)) {
message( 'E', "Select an storage item");
return;
}
if ( !(item->type == tblnav_eItemType_Local ||
item->type == tblnav_eItemType_TreeLocal)) {
message( 'E', "Select an storage item"); message( 'E', "Select an storage item");
return; return;
} }
hi = &((ItemLocal *)item)->item;
sprintf( msg, "Do you really wan't to delete all stored data for item\n\n%s.%s\n", hi->oname, hi->objectattrlist[0].aname); sprintf( msg, "Do you really wan't to delete all stored data for item\n\n%s.%s\n", hi->oname, hi->objectattrlist[0].aname);
......
...@@ -55,7 +55,8 @@ class XttTbl { ...@@ -55,7 +55,8 @@ class XttTbl {
int quiet; int quiet;
virtual void message( char severity, const char *message) {} virtual void message( char severity, const char *message) {}
virtual XttSevHist *sevhist_new( pwr_tOid oid, char *aname, bool sevhistobject) { return 0;} virtual XttSevHist *sevhist_new( pwr_tOid *oidv, pwr_tOName *anamev, pwr_tOName *onamev,
bool *sevhistobjectv) { return 0;}
virtual CoLogin *login_new( const char *wl_name, virtual CoLogin *login_new( const char *wl_name,
const char *wl_groupname, const char *wl_groupname,
void (* wl_bc_success)( void *), void (* wl_bc_success)( void *),
...@@ -78,6 +79,7 @@ class XttTbl { ...@@ -78,6 +79,7 @@ class XttTbl {
static void message( void *attr, char severity, const char *message); static void message( void *attr, char severity, const char *message);
static int is_authorized( void *ctx, unsigned int access, int msg); static int is_authorized( void *ctx, unsigned int access, int msg);
static int command_cb( void *ctx, char *cmd);
static void delete_item_yes( void *ctx, void *data); static void delete_item_yes( void *ctx, void *data);
virtual ~XttTbl(); virtual ~XttTbl();
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "co_error.h" #include "co_error.h"
#include "cow_wow.h" #include "cow_wow.h"
#include "xtt_tbl.h" #include "xtt_tbl.h"
#include "xtt_tblnav.h"
#include "co_dcli_msg.h" #include "co_dcli_msg.h"
#include "cow_xhelp.h" #include "cow_xhelp.h"
#include "cow_login.h" #include "cow_login.h"
...@@ -72,18 +73,25 @@ static int xtttbl_open_func( void *client_data, ...@@ -72,18 +73,25 @@ static int xtttbl_open_func( void *client_data,
void *client_flag); void *client_flag);
static int xtttbl_show_func( void *client_data, static int xtttbl_show_func( void *client_data,
void *client_flag); void *client_flag);
static int xtttbl_create_func( void *client_data,
void *client_flag);
dcli_tCmdTable xtttbl_command_table[] = { dcli_tCmdTable xtttbl_command_table[] = {
{ {
"OPEN", "OPEN",
&xtttbl_open_func, &xtttbl_open_func,
{ "dcli_arg1", ""} { "dcli_arg1", "dcli_arg2", "/NAME", ""}
}, },
{ {
"SHOW", "SHOW",
&xtttbl_show_func, &xtttbl_show_func,
{ "dcli_arg1", ""} { "dcli_arg1", ""}
}, },
{
"CREATE",
&xtttbl_create_func,
{ "dcli_arg1", "/NAME", "/COMMAND", ""}
},
{ {
"EXIT", "EXIT",
&xtttbl_exit_func, &xtttbl_exit_func,
...@@ -360,6 +368,116 @@ static int xtttbl_open_func( void *client_data, ...@@ -360,6 +368,116 @@ static int xtttbl_open_func( void *client_data,
if ( strncmp( arg1_str, "GRAPH", strlen( arg1_str)) == 0) if ( strncmp( arg1_str, "GRAPH", strlen( arg1_str)) == 0)
{ {
} }
else if ( cdh_NoCaseStrncmp( arg1_str, "HISTORY", strlen( arg1_str)) == 0)
{
pwr_tAName name_str;
char *name_ptr;
pwr_tAName name_array[10];
int i, names;
pwr_tOid oidv[11];
pwr_tOName anamev[11];
pwr_tOName onamev[11];
bool sevhistobjectv[11];
int sts;
// Command is "OPEN HISTORY"
/* Get the name qualifier */
if ( ODD( dcli_get_qualifier( "dcli_arg2", name_str, sizeof(name_str)))) {
if ( name_str[0] != '/')
/* Assume that this is the namestring */
name_ptr = name_str;
else {
xtttbl->message('E', "Syntax error");
return XTTTBL__HOLDCOMMAND;
}
}
else {
if ( ODD( dcli_get_qualifier( "/NAME", name_str, sizeof(name_str))))
name_ptr = name_str;
else {
/* Get the selected object */
ItemBase *item;
if ( !xtttbl->tblnav->get_select( &item)) {
xtttbl->message('E', "Enter name or select an object");
return XTTTBL__SUCCESS;
}
xtttbl->activate_opensevhist();
}
}
// The name string can contain several hists separated by ','
names = dcli_parse( name_str, ",", "",
(char *) name_array, sizeof( name_array)/sizeof( name_array[0]),
sizeof( name_array[0]), 0);
for ( i = 0; i < names; i++) {
TblNav_sevhistobject *hi;
if ( i == 10)
break;
sts = xtttbl->tblnav->get_item( name_array[i], &hi);
if ( EVEN(sts)) {
xtttbl->message('E', "Name object not found");
return XTTTBL__SUCCESS;
}
oidv[i] = hi->oid;
if ( hi->attrnum == 1) {
strcpy( anamev[i], hi->objectattrlist[0].aname);
sevhistobjectv[i] = false;
strcpy( onamev[i], hi->oname);
}
else {
strcpy( anamev[i], "");
sevhistobjectv[i] = true;
strcpy( onamev[i], hi->oname);
}
}
oidv[i] = pwr_cNOid;
xtttbl->sevhist_new( oidv, anamev, onamev, sevhistobjectv);
}
else
xtttbl->message('E',"Syntax error");
return XTTTBL__SUCCESS;
}
static int xtttbl_create_func( void *client_data,
void *client_flag)
{
XttTbl *xtttbl = (XttTbl *)client_data;
char arg1_str[80];
int arg1_sts;
arg1_sts = dcli_get_qualifier( "dcli_arg1", arg1_str, sizeof(arg1_str));
if ( strncmp( arg1_str, "ITEM", strlen( arg1_str)) == 0)
{
pwr_tOName name_str;
pwr_tCmd command_str;
// Command is "CREATE ITEM"
if ( EVEN( dcli_get_qualifier( "/NAME", name_str, sizeof(name_str)))) {
xtttbl->message('E', "Enter name");
return XTTTBL__SUCCESS;
}
if ( EVEN( dcli_get_qualifier( "/COMMAND", command_str, sizeof(command_str)))) {
xtttbl->message('E', "Enter command");
return XTTTBL__SUCCESS;
}
xtttbl->tblnav->add_item_command( name_str, command_str);
}
else else
xtttbl->message('E',"Syntax error"); xtttbl->message('E',"Syntax error");
......
...@@ -445,10 +445,14 @@ int TblNav::create_items() ...@@ -445,10 +445,14 @@ int TblNav::create_items()
} }
else { else {
for ( int idx = 1; idx; idx = tree[idx].fws) { for ( int idx = 1; idx; idx = tree[idx].fws) {
if ( tree[idx].item) if ( tree[idx].type == tblnav_eTreeItemType_SevHist)
new ItemTreeLocal( this, tree[idx].item, idx, NULL, flow_eDest_IntoLast); new ItemTreeLocal( this, &sevhistobjectlist[tree[idx].idx], idx, NULL,
flow_eDest_IntoLast);
if ( tree[idx].type == tblnav_eTreeItemType_Command)
new ItemTreeCommand( this, &commandlist[tree[idx].idx], idx, NULL,
flow_eDest_IntoLast);
else else
new ItemTreeNode( this, tree[idx].sname, idx, NULL, flow_eDest_IntoLast); new ItemTreeNode( this, tree[idx].sname, idx, NULL, flow_eDest_IntoLast);
} }
} }
brow_ResetNodraw( brow->ctx); brow_ResetNodraw( brow->ctx);
...@@ -518,6 +522,11 @@ int TblNav::init_brow_cb( FlowCtx *fctx, void *client_data) ...@@ -518,6 +522,11 @@ int TblNav::init_brow_cb( FlowCtx *fctx, void *client_data)
// Create the root items // Create the root items
tblnav->create_items(); tblnav->create_items();
if ( tblnav->command_cb) {
pwr_tCmd cmd = "@$HOME/sev_xtt_setup";
tblnav->command_cb( tblnav->parent_ctx, cmd);
}
//sts = brow_TraceInit( ctx, tblnav_trace_connect_bc, //sts = brow_TraceInit( ctx, tblnav_trace_connect_bc,
// tblnav_trace_disconnect_bc, tblnav_trace_scan_bc); // tblnav_trace_disconnect_bc, tblnav_trace_scan_bc);
//tblnav->trace_started = 1; //tblnav->trace_started = 1;
...@@ -528,24 +537,28 @@ int TblNav::init_brow_cb( FlowCtx *fctx, void *client_data) ...@@ -528,24 +537,28 @@ int TblNav::init_brow_cb( FlowCtx *fctx, void *client_data)
} }
int TblNav::get_select( TblNav_sevhistobject **hi) int TblNav::get_select( ItemBase **item)
{ {
brow_tNode *node_list; brow_tNode *node_list;
int node_count; int node_count;
ItemLocal *item;
brow_GetSelectedNodes( brow->ctx, &node_list, &node_count); brow_GetSelectedNodes( brow->ctx, &node_list, &node_count);
if ( !node_count) if ( !node_count)
return 0; return 0;
brow_GetUserData( node_list[0], (void **)&item); brow_GetUserData( node_list[0], (void **)item);
switch ( item->type) { return 1;
case tblnav_eItemType_Local: }
case tblnav_eItemType_TreeLocal:
*hi = &item->item; int TblNav::get_item( char *oname, TblNav_sevhistobject **hi)
return 1; {
default: ; for ( int i = 0; i < (int)sevhistobjectlist.size(); i++) {
if ( cdh_NoCaseStrcmp( sevhistobjectlist[i].oname, oname) == 0) {
*hi = &sevhistobjectlist[i];
return 1;
}
} }
return 0; return 0;
} }
...@@ -586,9 +599,10 @@ void TblNav::delete_item( TblNav_sevhistobject *hi) ...@@ -586,9 +599,10 @@ void TblNav::delete_item( TblNav_sevhistobject *hi)
for ( int i = 1; i < (int)tree.size(); i++) { for ( int i = 1; i < (int)tree.size(); i++) {
if ( tree[i].deleted) if ( tree[i].deleted)
continue; continue;
if ( tree[i].item && if ( tree[i].type == tblnav_eTreeItemType_SevHist &&
cdh_ObjidIsEqual( tree[i].item->oid, hi->oid) && cdh_ObjidIsEqual( sevhistobjectlist[tree[i].idx].oid, hi->oid) &&
strcmp( tree[i].item->objectattrlist[0].aname, hi->objectattrlist[0].aname) == 0) { strcmp( sevhistobjectlist[tree[i].idx].objectattrlist[0].aname,
hi->objectattrlist[0].aname) == 0) {
tree[i].deleted = 1; tree[i].deleted = 1;
} }
} }
...@@ -617,6 +631,17 @@ void TblNav::delete_item( TblNav_sevhistobject *hi) ...@@ -617,6 +631,17 @@ void TblNav::delete_item( TblNav_sevhistobject *hi)
} }
} }
void TblNav::add_item_command( char *name, char *command)
{
TblNav_command item;
strncpy( item.oname, name, sizeof(item.oname));
strncpy( item.command, command, sizeof(item.command));
commandlist.push_back( item);
tree_add( name, commandlist.size()-1, tblnav_eTreeItemType_Command);
}
ItemLocal::ItemLocal( TblNav *tblnav, TblNav_sevhistobject *xitem, ItemLocal::ItemLocal( TblNav *tblnav, TblNav_sevhistobject *xitem,
brow_tNode dest, flow_eDest dest_code) : brow_tNode dest, flow_eDest dest_code) :
ItemBase( tblnav_eItemType_Local), item(*xitem) ItemBase( tblnav_eItemType_Local), item(*xitem)
...@@ -784,6 +809,30 @@ ItemTreeLocal::ItemTreeLocal( TblNav *tblnav, TblNav_sevhistobject *xitem, int i ...@@ -784,6 +809,30 @@ ItemTreeLocal::ItemTreeLocal( TblNav *tblnav, TblNav_sevhistobject *xitem, int i
brow_SetAnnotation( node, 0, aname, strlen(aname)); brow_SetAnnotation( node, 0, aname, strlen(aname));
} }
ItemTreeCommand::ItemTreeCommand( TblNav *tblnav, TblNav_command *xitem, int index,
brow_tNode dest, flow_eDest dest_code) :
ItemBase(tblnav_eItemType_TreeCommand), item(*xitem), idx(index)
{
pwr_tAName aname;
char *s;
type = tblnav_eItemType_TreeCommand;
if ((s = strrchr( item.oname, '-')))
strcpy( aname, s+1);
else
strcpy( aname, item.oname);
brow_CreateNode( tblnav->brow->ctx, "TreeNodeCommand", tblnav->brow->nc_attr,
dest, dest_code, (void *) this, 1, &node);
if ( tblnav->tree[idx].fch)
brow_SetAnnotPixmap( node, 0, tblnav->brow->pixmap_map);
else
brow_SetAnnotPixmap( node, 0, tblnav->brow->pixmap_leaf);
brow_SetAnnotation( node, 0, aname, strlen(aname));
}
ItemTreeNode::ItemTreeNode( TblNav *tblnav, char *name, int index, ItemTreeNode::ItemTreeNode( TblNav *tblnav, char *name, int index,
brow_tNode dest, flow_eDest dest_code) : brow_tNode dest, flow_eDest dest_code) :
ItemBase(tblnav_eItemType_TreeNode), idx(index) ItemBase(tblnav_eItemType_TreeNode), idx(index)
...@@ -821,10 +870,14 @@ int ItemTreeNode::open_children( TblNav *tblnav, double x, double y) ...@@ -821,10 +870,14 @@ int ItemTreeNode::open_children( TblNav *tblnav, double x, double y)
if ( tblnav->tree[i].deleted) if ( tblnav->tree[i].deleted)
continue; continue;
if ( tblnav->tree[i].item) if ( tblnav->tree[i].type == tblnav_eTreeItemType_SevHist)
new ItemTreeLocal( tblnav, tblnav->tree[i].item, i, node, flow_eDest_IntoLast); new ItemTreeLocal( tblnav, &tblnav->sevhistobjectlist[tblnav->tree[i].idx], i, node,
flow_eDest_IntoLast);
else if ( tblnav->tree[i].type == tblnav_eTreeItemType_Command)
new ItemTreeCommand( tblnav, &tblnav->commandlist[tblnav->tree[i].idx], i, node,
flow_eDest_IntoLast);
else else
new ItemTreeNode( tblnav, tblnav->tree[i].sname, i, node, flow_eDest_IntoLast); new ItemTreeNode( tblnav, tblnav->tree[i].sname, i, node, flow_eDest_IntoLast);
} }
brow_SetOpen( node, tblnav_mOpen_Children); brow_SetOpen( node, tblnav_mOpen_Children);
brow_SetAnnotPixmap( node, 1, tblnav->brow->pixmap_openmap); brow_SetAnnotPixmap( node, 1, tblnav->brow->pixmap_openmap);
...@@ -852,9 +905,7 @@ int ItemTreeNode::close( TblNav *tblnav, double x, double y) ...@@ -852,9 +905,7 @@ int ItemTreeNode::close( TblNav *tblnav, double x, double y)
void TblNav::build_tree() void TblNav::build_tree()
{ {
pwr_tObjName name_array[24];
pwr_tAName aname; pwr_tAName aname;
int seg;
for ( int i = 0; i < (int)sevhistobjectlist.size(); i++) { for ( int i = 0; i < (int)sevhistobjectlist.size(); i++) {
TblTreeNode n; TblTreeNode n;
...@@ -863,88 +914,106 @@ void TblNav::build_tree() ...@@ -863,88 +914,106 @@ void TblNav::build_tree()
strcat( aname, "."); strcat( aname, ".");
strcat( aname, sevhistobjectlist[i].objectattrlist[0].aname); strcat( aname, sevhistobjectlist[i].objectattrlist[0].aname);
seg = dcli_parse( aname, "-", "", tree_add( aname, i, tblnav_eTreeItemType_SevHist);
(char *) name_array, sizeof( name_array)/sizeof( name_array[0]), }
sizeof( name_array[0]), 0); }
if ( tree.size() == 0) { void TblNav::tree_add( char *name, int list_index, tblnav_eTreeItemType type)
// First item {
TblTreeNode n0; pwr_tObjName name_array[24];
strcpy( n0.sname, "nonode"); int seg;
tree.push_back(n0);
seg = dcli_parse( name, "-", "",
for ( int j = 0; j < seg; j++) { (char *) name_array, sizeof( name_array)/sizeof( name_array[0]),
TblTreeNode n; sizeof( name_array[0]), 0);
n.fth = j; if ( tree.size() == 0) {
tree[j].fch = j + 1; // First item
strcpy( n.sname, name_array[j]); TblTreeNode n0;
if ( j == seg -1) strcpy( n0.sname, "nonode");
n.item = &sevhistobjectlist[i]; tree.push_back(n0);
tree.push_back(n);
for ( int j = 0; j < seg; j++) {
TblTreeNode n;
n.fth = j;
tree[j].fch = j + 1;
strcpy( n.sname, name_array[j]);
if ( j == seg -1) {
n.idx = list_index;
n.type = type;
} }
tree.push_back(n);
} }
else { }
int idx = 1; else {
int last = idx; int idx = 1;
for ( int j = 0; j < seg; j++) { int last = idx;
int found = 0; for ( int j = 0; j < seg; j++) {
while ( idx) { int found = 0;
last = idx; while ( idx) {
if ( strcmp( tree[idx].sname, name_array[j]) == 0) { last = idx;
found = 1; if ( strcmp( tree[idx].sname, name_array[j]) == 0) {
break; found = 1;
} break;
idx = tree[idx].fws; }
} idx = tree[idx].fws;
if ( !found) { }
TblTreeNode n; if ( !found) {
strcpy( n.sname, name_array[j]); TblTreeNode n;
n.fth = tree[last].fth; strcpy( n.sname, name_array[j]);
n.bws = last; n.fth = tree[last].fth;
tree[last].fws = tree.size(); n.bws = last;
if ( j == seg - 1) tree[last].fws = tree.size();
n.item = &sevhistobjectlist[i]; if ( j == seg - 1) {
tree.push_back(n); n.idx = list_index;
n.type = type;
for ( int k = j + 1; k < seg; k++) { }
TblTreeNode n; tree.push_back(n);
n.fth = tree.size() - 1; for ( int k = j + 1; k < seg; k++) {
if ( tree[n.fth].fch == 0) TblTreeNode n;
tree[n.fth].fch = tree.size();
strcpy( n.sname, name_array[k]); n.fth = tree.size() - 1;
if ( k == seg - 1) if ( tree[n.fth].fch == 0)
n.item = &sevhistobjectlist[i]; tree[n.fth].fch = tree.size();
tree.push_back(n); strcpy( n.sname, name_array[k]);
} if ( k == seg - 1) {
break; n.idx = list_index;
} n.type = type;
if ( tree[idx].fch == 0) { }
TblTreeNode n; tree.push_back(n);
strcpy( n.sname, name_array[j]); }
n.fth = tree[last].fth; break;
n.bws = last;
tree[last].fws = tree.size();
if ( j == seg - 1)
n.item = &sevhistobjectlist[i];
tree.push_back(n);
for ( int k = j + 1; k < seg; k++) {
TblTreeNode n;
n.fth = tree.size() - 1;
if ( tree[n.fth].fch == 0)
tree[n.fth].fch = tree.size();
strcpy( n.sname, name_array[k]);
if ( k == seg - 1)
n.item = &sevhistobjectlist[i];
tree.push_back(n);
}
break;
} }
idx = tree[idx].fch; if ( tree[idx].fch == 0) {
last = idx; TblTreeNode n;
strcpy( n.sname, name_array[j]);
n.fth = tree[last].fth;
n.bws = last;
tree[last].fws = tree.size();
if ( j == seg - 1) {
n.idx = list_index;
n.type = type;
}
tree.push_back(n);
for ( int k = j + 1; k < seg; k++) {
TblTreeNode n;
n.fth = tree.size() - 1;
if ( tree[n.fth].fch == 0)
tree[n.fth].fch = tree.size();
strcpy( n.sname, name_array[k]);
if ( k == seg - 1) {
n.idx = list_index;
n.type = type;
}
tree.push_back(n);
}
break;
} }
idx = tree[idx].fch;
last = idx;
} }
} }
} }
......
...@@ -49,12 +49,15 @@ ...@@ -49,12 +49,15 @@
#include "rt_sevcli.h" #include "rt_sevcli.h"
#endif #endif
class ItemBase;
typedef enum { typedef enum {
tblnav_eItemType_Local, tblnav_eItemType_Local,
tblnav_eItemType_LocalAttr, tblnav_eItemType_LocalAttr,
tblnav_eItemType_TreeLocal, tblnav_eItemType_TreeLocal,
tblnav_eItemType_TreeNode tblnav_eItemType_TreeNode,
tblnav_eItemType_TreeCommand
} tblnav_eItemType; } tblnav_eItemType;
typedef enum { typedef enum {
...@@ -87,17 +90,30 @@ class TblNav_sevhistobject { ...@@ -87,17 +90,30 @@ class TblNav_sevhistobject {
vector<TblNav_sevhistobjectattr> objectattrlist; vector<TblNav_sevhistobjectattr> objectattrlist;
}; };
class TblNav_command {
public:
pwr_tAName oname;
pwr_tCmd command;
};
typedef enum {
tblnav_eTreeItemType_No,
tblnav_eTreeItemType_SevHist,
tblnav_eTreeItemType_Command
} tblnav_eTreeItemType;
class TblTreeNode { class TblTreeNode {
public: public:
TblTreeNode() : fth(0), fch(0), fws(0), bws(0), item(0), deleted(0) TblTreeNode() : fth(0), fch(0), fws(0), bws(0), type(tblnav_eTreeItemType_No), idx(0), deleted(0)
{ strcpy( sname, "");} { strcpy( sname, "");}
int fth; int fth;
int fch; int fch;
int fws; int fws;
int bws; int bws;
char sname[80]; char sname[80];
TblNav_sevhistobject *item; tblnav_eTreeItemType type;
int idx;
int deleted; int deleted;
}; };
...@@ -138,9 +154,11 @@ class TblNav { ...@@ -138,9 +154,11 @@ class TblNav {
TblNavBrow *brow; TblNavBrow *brow;
sevcli_sHistItem *itemlist; sevcli_sHistItem *itemlist;
vector<TblNav_sevhistobject> sevhistobjectlist; vector<TblNav_sevhistobject> sevhistobjectlist;
vector<TblNav_command> commandlist;
int item_cnt; int item_cnt;
void (*message_cb)( void *, char, const char *); void (*message_cb)( void *, char, const char *);
int (*is_authorized_cb)( void *, unsigned int, int); int (*is_authorized_cb)( void *, unsigned int, int);
int (*command_cb)( void *, char *cmd);
vector<TblTreeNode> tree; vector<TblTreeNode> tree;
int list_layout; int list_layout;
...@@ -148,7 +166,9 @@ class TblNav { ...@@ -148,7 +166,9 @@ class TblNav {
int is_authorized( unsigned int access = pwr_mAccess_AllSev, int msg = 1); int is_authorized( unsigned int access = pwr_mAccess_AllSev, int msg = 1);
int create_items(); int create_items();
void build_tree(); void build_tree();
int get_select( TblNav_sevhistobject **hi); void tree_add( char *name, int list_index, tblnav_eTreeItemType type);
int get_select( ItemBase **item);
int get_item( char *oname, TblNav_sevhistobject **hi);
void get_zoom( double *zoom_factor); void get_zoom( double *zoom_factor);
void zoom( double zoom_factor); void zoom( double zoom_factor);
void unzoom(); void unzoom();
...@@ -158,6 +178,8 @@ class TblNav { ...@@ -158,6 +178,8 @@ class TblNav {
void create_objectlist( sevcli_sHistItem *xn_itemlist, void create_objectlist( sevcli_sHistItem *xn_itemlist,
int xn_item_cnt, int xn_item_cnt,
pwr_tStatus *status); pwr_tStatus *status);
void add_item_command( char *name, char *command);
virtual void message( char sev, const char *text); virtual void message( char sev, const char *text);
virtual void set_inputfocus() {} virtual void set_inputfocus() {}
static int init_brow_cb( FlowCtx *fctx, void *client_data); static int init_brow_cb( FlowCtx *fctx, void *client_data);
...@@ -220,5 +242,17 @@ class ItemTreeNode : public ItemBase { ...@@ -220,5 +242,17 @@ class ItemTreeNode : public ItemBase {
}; };
//! Item for a command object.
class ItemTreeCommand : public ItemBase {
public:
ItemTreeCommand( TblNav *tblnav, TblNav_command *xitem, int index, brow_tNode dest, flow_eDest dest_code);
virtual ~ItemTreeCommand() {}
TblNav_command item;
int idx;
brow_tNode node;
};
#endif #endif
...@@ -348,7 +348,7 @@ int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, ...@@ -348,7 +348,7 @@ int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid,
*sts = rmsg->Status; *sts = rmsg->Status;
if ( EVEN(*sts)) { if ( EVEN(*sts)) {
qcom_Free( sts, rmsg); qcom_Free( &lsts, rmsg);
return 0; return 0;
} }
...@@ -363,7 +363,7 @@ int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, ...@@ -363,7 +363,7 @@ int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid,
*vtype = rmsg->VType; *vtype = rmsg->VType;
*vsize = rmsg->VSize; *vsize = rmsg->VSize;
qcom_Free( sts, rmsg); qcom_Free( &lsts, rmsg);
*sts = SEV__SUCCESS; *sts = SEV__SUCCESS;
return 1; return 1;
......
...@@ -134,6 +134,7 @@ static pwr_tStatus SyntaxCheck ( ...@@ -134,6 +134,7 @@ static pwr_tStatus SyntaxCheck (
pwr_tOid thread_oid; pwr_tOid thread_oid;
wb_session *sp = (wb_session *)Session; wb_session *sp = (wb_session *)Session;
pwr_tAttrRef dataname_aref; pwr_tAttrRef dataname_aref;
pwr_tDeltaTime storagetime;
wb_attribute a = sp->attribute( &Object); wb_attribute a = sp->attribute( &Object);
if ( !a) return a.sts(); if ( !a) return a.sts();
...@@ -151,6 +152,16 @@ static pwr_tStatus SyntaxCheck ( ...@@ -151,6 +152,16 @@ static pwr_tStatus SyntaxCheck (
else if ( othread.cid() != pwr_cClass_SevHistThread) else if ( othread.cid() != pwr_cClass_SevHistThread)
wsx_error_msg_str( Session, "Bad thread object class", Object, 'E', ErrorCount, WarningCount); wsx_error_msg_str( Session, "Bad thread object class", Object, 'E', ErrorCount, WarningCount);
// Check StorageTime
wb_attribute storagetime_a( a, 0, "StorageTime");
if (!storagetime_a) return storagetime_a.sts();
storagetime_a.value( &storagetime);
if ( !storagetime_a) return storagetime_a.sts();
if ( storagetime.tv_sec == 0 && storagetime.tv_nsec == 0)
wsx_error_msg_str( Session, "Bad StorageTime", Object, 'E', ErrorCount, WarningCount);
// Check Attribute // Check Attribute
wb_attribute dataname_a( a, 0, "Attribute"); wb_attribute dataname_a( a, 0, "Attribute");
if (!dataname_a) return dataname_a.sts(); if (!dataname_a) return dataname_a.sts();
......
...@@ -71,6 +71,8 @@ static pwr_tStatus SyntaxCheck ( ...@@ -71,6 +71,8 @@ static pwr_tStatus SyntaxCheck (
) { ) {
pwr_tOid thread_oid; pwr_tOid thread_oid;
wb_session *sp = (wb_session *)Session; wb_session *sp = (wb_session *)Session;
pwr_tAttrRef dataname_aref;
pwr_tDeltaTime storagetime;
wb_attribute a = sp->attribute( &Object); wb_attribute a = sp->attribute( &Object);
if ( !a) return a.sts(); if ( !a) return a.sts();
...@@ -88,6 +90,28 @@ static pwr_tStatus SyntaxCheck ( ...@@ -88,6 +90,28 @@ static pwr_tStatus SyntaxCheck (
else if ( othread.cid() != pwr_cClass_SevHistThread) else if ( othread.cid() != pwr_cClass_SevHistThread)
wsx_error_msg_str( Session, "Bad thread object class", Object, 'E', ErrorCount, WarningCount); wsx_error_msg_str( Session, "Bad thread object class", Object, 'E', ErrorCount, WarningCount);
// Check StorageTime
wb_attribute storagetime_a( a, 0, "StorageTime");
if (!storagetime_a) return storagetime_a.sts();
storagetime_a.value( &storagetime);
if ( !storagetime_a) return storagetime_a.sts();
if ( storagetime.tv_sec == 0 && storagetime.tv_nsec == 0)
wsx_error_msg_str( Session, "Bad StorageTime", Object, 'E', ErrorCount, WarningCount);
// Check Attribute
wb_attribute dataname_a( a, 0, "Attribute");
if (!dataname_a) return dataname_a.sts();
dataname_a.value( &dataname_aref);
if ( !dataname_a) return dataname_a.sts();
wb_attribute data_a = sp->attribute( &dataname_aref);
if ( !data_a) {
wsx_error_msg_str( Session, "Bad Attribute reference", Object, 'E', ErrorCount, WarningCount);
return PWRB__SUCCESS;
}
return PWRB__SUCCESS; return PWRB__SUCCESS;
} }
......
...@@ -527,8 +527,8 @@ GeCurveGtk::GeCurveGtk( void *gc_parent_ctx, ...@@ -527,8 +527,8 @@ GeCurveGtk::GeCurveGtk( void *gc_parent_ctx,
gtk_paned_add2( GTK_PANED(vpaned1), vpaned2); gtk_paned_add2( GTK_PANED(vpaned1), vpaned2);
gtk_widget_show_all( vpaned1); gtk_widget_show_all( vpaned1);
gtk_paned_add1( GTK_PANED(vpaned2), hbox); gtk_paned_pack1( GTK_PANED(vpaned2), hbox, TRUE, TRUE);
gtk_paned_add2( GTK_PANED(vpaned2), nav_widget); gtk_paned_pack2( GTK_PANED(vpaned2), nav_widget, FALSE, TRUE);
gtk_widget_show_all( vpaned2); gtk_widget_show_all( vpaned2);
GtkWidget *vbox = gtk_vbox_new( FALSE, 0); GtkWidget *vbox = gtk_vbox_new( FALSE, 0);
......
...@@ -131,6 +131,12 @@ void GeCurve::activate_minmax_ok( double min_value, double max_value) ...@@ -131,6 +131,12 @@ void GeCurve::activate_minmax_ok( double min_value, double max_value)
&cd->x_trend_lines[i], &cd->x_axis_lines[i], &cd->x_axis_linelongq[i], &cd->x_trend_lines[i], &cd->x_axis_lines[i], &cd->x_axis_linelongq[i],
&cd->x_axis_valueq[i], cd->x_format[i], &cd->x_axis_valueq[i], cd->x_format[i],
&axis_width, 1, 1); &axis_width, 1, 1);
if ( cd->type == curve_eDataType_MultiTrend) {
for ( i = 1; i < cd->cols; i++) {
cd->x_min_value_axis[i] = cd->x_min_value_axis[0];
cd->x_max_value_axis[i] = cd->x_max_value_axis[0];
}
}
} }
// cd->min_value_axis[minmax_idx] = min_value; // cd->min_value_axis[minmax_idx] = min_value;
...@@ -152,8 +158,38 @@ int GeCurve::growcurve_cb( GlowCtx *ctx, glow_tEvent event) ...@@ -152,8 +158,38 @@ int GeCurve::growcurve_cb( GlowCtx *ctx, glow_tEvent event)
grow_GetCtxUserData( (GrowCtx *)ctx, (void **) &curve); grow_GetCtxUserData( (GrowCtx *)ctx, (void **) &curve);
switch ( event->event) { switch ( event->event) {
case glow_eEvent_MB1Click: case glow_eEvent_MB1Click: {
// Move mark slider to this position
double ll_x, ll_y, ur_x, ur_y;
char str[40];
double time;
double values[CURVE_MAX_COLS];
grow_MeasureNode( curve->curve_markobject, &ll_x, &ll_y, &ur_x, &ur_y);
grow_MoveNode( curve->curve_markobject, event->any.x - (ur_x - ll_x)/2, ll_y);
grow_Redraw( curve->growcurve_ctx);
curve->x_to_points( event->any.x, &time, values);
for ( int i = 0; i < curve->cd->cols; i++) {
sprintf( str, "%7.2f", values[i]);
grow_SetAnnotation( curve->mark_annot[i], 0, str, strlen(str));
}
if ( !(strcmp( curve->cd->x_format[0], "%10t") == 0 ||
strcmp( curve->cd->x_format[0], "%11t") == 0)) {
sprintf( str, "%7.2f", time);
grow_SetAnnotation( curve->mark_annot[curve->cd->cols], 0, str, strlen(str));
}
else {
// Time is a date
pwr_tTime t;
time_Float64ToD( (pwr_tDeltaTime *) &t, time);
time_AtoAscii( &t, time_eFormat_DateAndTime, str, sizeof(str));
grow_SetAnnotation( curve->mark_annot[curve->cd->cols], 0, str, strlen(str));
}
break; break;
}
case glow_eEvent_SliderMoveStart: { case glow_eEvent_SliderMoveStart: {
if ( event->object.object_type == glow_eObjectType_NoObject) if ( event->object.object_type == glow_eObjectType_NoObject)
grow_SetMoveRestrictions( (GrowCtx *)ctx, glow_eMoveRestriction_Disable, 0, 0, NULL); grow_SetMoveRestrictions( (GrowCtx *)ctx, glow_eMoveRestriction_Disable, 0, 0, NULL);
...@@ -190,7 +226,7 @@ int GeCurve::growcurve_cb( GlowCtx *ctx, glow_tEvent event) ...@@ -190,7 +226,7 @@ int GeCurve::growcurve_cb( GlowCtx *ctx, glow_tEvent event)
pwr_tTime t; pwr_tTime t;
time_Float64ToD( (pwr_tDeltaTime *) &t, time); time_Float64ToD( (pwr_tDeltaTime *) &t, time);
time_AtoAscii( &t, time_eFormat_DateAndTime, str, sizeof(str)); time_AtoAscii( &t, time_eFormat_DateAndTime, str, sizeof(str));
grow_SetAnnotation( curve->mark_annot[0], 0, str, strlen(str)); grow_SetAnnotation( curve->mark_annot[curve->cd->cols], 0, str, strlen(str));
} }
#if 0 #if 0
if ( !curve->cd->x_reverse) if ( !curve->cd->x_reverse)
...@@ -203,9 +239,9 @@ int GeCurve::growcurve_cb( GlowCtx *ctx, glow_tEvent event) ...@@ -203,9 +239,9 @@ int GeCurve::growcurve_cb( GlowCtx *ctx, glow_tEvent event)
// Approximate row // Approximate row
row = int ((time - curve->cd->min_value[0]) / row = int ((time - curve->cd->min_value[0]) /
(curve->cd->max_value[0] - curve->cd->min_value[0]) * (curve->cd->max_value[0] - curve->cd->min_value[0]) *
(curve->cd->rows - 1) + 0.5); (curve->cd->rows[0] - 1) + 0.5);
if ( row > curve->cd->rows - 1) if ( row > curve->cd->rows[0] - 1)
row = curve->cd->rows - 1; row = curve->cd->rows[0] - 1;
else if ( row < 0) else if ( row < 0)
row = 0; row = 0;
else { else {
...@@ -219,7 +255,7 @@ int GeCurve::growcurve_cb( GlowCtx *ctx, glow_tEvent event) ...@@ -219,7 +255,7 @@ int GeCurve::growcurve_cb( GlowCtx *ctx, glow_tEvent event)
break; break;
r++; r++;
} }
else if ( r == curve->cd->rows - 1) { else if ( r == curve->cd->rows[0] - 1) {
b1 = (curve->cd->data[0][r] + curve->cd->data[0][r-1]) / 2; b1 = (curve->cd->data[0][r] + curve->cd->data[0][r-1]) / 2;
if ( time >= b1) if ( time >= b1)
break; break;
...@@ -356,7 +392,7 @@ int GeCurve::init_growcurve_cb( GlowCtx *fctx, void *client_data) ...@@ -356,7 +392,7 @@ int GeCurve::init_growcurve_cb( GlowCtx *fctx, void *client_data)
grow_CreateGrowCurve( curve->growcurve_ctx, "curve", NULL, 0, 0, 200, 30, grow_CreateGrowCurve( curve->growcurve_ctx, "curve", NULL, 0, 0, 200, 30,
curve->curve_border, 2, glow_mDisplayLevel_1, 1, 1, curve->curve_border, 2, glow_mDisplayLevel_1, 1, 1,
curve->curve_color, curve, &curve->curve_object); curve->curve_color, curve, &curve->curve_object);
grow_CreateGrowAxis( curve->growcurve_ctx, "y_axis", 0, 30, 200, 32, grow_CreateGrowAxis( curve->growcurve_ctx, "y_axis", 0, 30, 200, 31.85,
glow_eDrawType_Line, 1, 5, glow_eDrawType_Line, 1, 5,
glow_eDrawType_TextHelvetica, curve, glow_eDrawType_TextHelvetica, curve,
&curve->curve_axisobject); &curve->curve_axisobject);
...@@ -367,7 +403,7 @@ int GeCurve::init_growcurve_cb( GlowCtx *fctx, void *client_data) ...@@ -367,7 +403,7 @@ int GeCurve::init_growcurve_cb( GlowCtx *fctx, void *client_data)
grow_AddRect( nc, "", -MARK_WIDTH/2, 30.1, MARK_WIDTH, 1.8, glow_eDrawType_LineGray, 1, 0, grow_AddRect( nc, "", -MARK_WIDTH/2, 30.1, MARK_WIDTH, 1.8, glow_eDrawType_LineGray, 1, 0,
glow_mDisplayLevel_1, 0, 0, 1, glow_mDisplayLevel_1, 0, 0, 1,
glow_eDrawType_Color33, NULL); glow_eDrawType_Color33, NULL);
glow_sPoint p1[3] = { {-0.1, 30.3}, {-MARK_WIDTH/2+0.1, 31},{-0.1, 31.7}}; glow_sPoint p1[3] = { {-0.1, 30.3}, {-MARK_WIDTH/2+0.1, 31},{-0.1, 31.85}};
grow_AddPolyLine( nc, "", p1, 3, glow_eDrawType_Line, 1, 0, 1, 0, 1, glow_eDrawType_Color38, grow_AddPolyLine( nc, "", p1, 3, glow_eDrawType_Line, 1, 0, 1, 0, 1, glow_eDrawType_Color38,
1, 0); 1, 0);
glow_sPoint p2[3] = { {0.1, 30.3}, { MARK_WIDTH/2-0.1, 31},{ 0.1, 31.7}}; glow_sPoint p2[3] = { {0.1, 30.3}, { MARK_WIDTH/2-0.1, 31},{ 0.1, 31.7}};
...@@ -605,32 +641,32 @@ int GeCurve::init_grownames_cb( GlowCtx *fctx, void *client_data) ...@@ -605,32 +641,32 @@ int GeCurve::init_grownames_cb( GlowCtx *fctx, void *client_data)
x = 0.8; x = 0.8;
grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("View"), grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("View"),
x, 0.6, glow_eDrawType_TextHelvetica, x, 0.6, glow_eDrawType_TextHelvetica,
glow_eDrawType_Line, 2, glow_eFont_Helvetica, glow_eDrawType_Line, 2, glow_eFont_LucidaSans,
glow_mDisplayLevel_1, NULL, &o1); glow_mDisplayLevel_1, NULL, &o1);
x += 2.2; x += 1.8;
grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Cursor"), grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Cursor"),
x, 0.6, glow_eDrawType_TextHelvetica, x, 0.6, glow_eDrawType_TextHelvetica,
glow_eDrawType_Line, 2, glow_eFont_Helvetica, glow_eDrawType_Line, 2, glow_eFont_LucidaSans,
glow_mDisplayLevel_1, NULL, &o1); glow_mDisplayLevel_1, NULL, &o1);
x += time_size + 0.2; x += time_size + 0.2;
grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Mark"), grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Mark"),
x, 0.6, glow_eDrawType_TextHelvetica, x, 0.6, glow_eDrawType_TextHelvetica,
glow_eDrawType_Line, 2, glow_eFont_Helvetica, glow_eDrawType_Line, 2, glow_eFont_LucidaSans,
glow_mDisplayLevel_1, NULL, &o1); glow_mDisplayLevel_1, NULL, &o1);
x += time_size + 0.2; x += time_size + 0.2;
grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Unit"), grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Unit"),
x, 0.6, glow_eDrawType_TextHelvetica, x, 0.6, glow_eDrawType_TextHelvetica,
glow_eDrawType_Line, 2, glow_eFont_Helvetica, glow_eDrawType_Line, 2, glow_eFont_LucidaSans,
glow_mDisplayLevel_1, NULL, &o1); glow_mDisplayLevel_1, NULL, &o1);
x += 2; x += 2;
grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Scale"), grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Scale"),
x, 0.6, glow_eDrawType_TextHelvetica, x, 0.6, glow_eDrawType_TextHelvetica,
glow_eDrawType_Line, 2, glow_eFont_Helvetica, glow_eDrawType_Line, 2, glow_eFont_LucidaSans,
glow_mDisplayLevel_1, NULL, &o1); glow_mDisplayLevel_1, NULL, &o1);
x += 3; x += 3;
grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Attribute"), grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Attribute"),
x, 0.6, glow_eDrawType_TextHelvetica, x, 0.6, glow_eDrawType_TextHelvetica,
glow_eDrawType_Line, 2, glow_eFont_Helvetica, glow_eDrawType_Line, 2, glow_eFont_LucidaSans,
glow_mDisplayLevel_1, NULL, &o1); glow_mDisplayLevel_1, NULL, &o1);
for ( int i = 0; i < curve->cd->cols; i++) { for ( int i = 0; i < curve->cd->cols; i++) {
...@@ -668,7 +704,7 @@ int GeCurve::init_grownames_cb( GlowCtx *fctx, void *client_data) ...@@ -668,7 +704,7 @@ int GeCurve::init_grownames_cb( GlowCtx *fctx, void *client_data)
x += time_size + 0.6; x += time_size + 0.6;
grow_CreateGrowText( curve->grownames_ctx, "", curve->cd->y_unit[i], grow_CreateGrowText( curve->grownames_ctx, "", curve->cd->y_unit[i],
x, (i+0.8) + 0.75, glow_eDrawType_TextHelvetica, x, (i+0.8) + 0.75, glow_eDrawType_TextHelvetica,
glow_eDrawType_Line, 2, glow_eFont_Helvetica, glow_eDrawType_Line, 2, glow_eFont_LucidaSans,
glow_mDisplayLevel_1, NULL, &t1); glow_mDisplayLevel_1, NULL, &t1);
// Draw button for scale // Draw button for scale
x += 2; x += 2;
...@@ -679,8 +715,8 @@ int GeCurve::init_grownames_cb( GlowCtx *fctx, void *client_data) ...@@ -679,8 +715,8 @@ int GeCurve::init_grownames_cb( GlowCtx *fctx, void *client_data)
// Draw attribute name // Draw attribute name
x += 3; x += 3;
grow_CreateGrowText( curve->grownames_ctx, "", curve->cd->y_name[i], grow_CreateGrowText( curve->grownames_ctx, "", curve->cd->y_name[i],
x, (i+0.8) + 0.75, glow_eDrawType_TextHelveticaBold, x, (i+0.8) + 0.75, glow_eDrawType_TextHelvetica,
glow_eDrawType_Line, 2, glow_eFont_Helvetica, glow_eDrawType_Line, 2, glow_eFont_LucidaSans,
glow_mDisplayLevel_1, NULL, &t1); glow_mDisplayLevel_1, NULL, &t1);
grow_SetAnnotation( curve->cursor_annot[i], 0, "0", 1); grow_SetAnnotation( curve->cursor_annot[i], 0, "0", 1);
grow_SetAnnotation( curve->mark_annot[i], 0, "0", 1); grow_SetAnnotation( curve->mark_annot[i], 0, "0", 1);
...@@ -700,7 +736,7 @@ int GeCurve::init_grownames_cb( GlowCtx *fctx, void *client_data) ...@@ -700,7 +736,7 @@ int GeCurve::init_grownames_cb( GlowCtx *fctx, void *client_data)
x += time_size + 0.6; x += time_size + 0.6;
grow_CreateGrowText( curve->grownames_ctx, "", "s", grow_CreateGrowText( curve->grownames_ctx, "", "s",
x, (curve->cd->cols+0.8) + 0.75, glow_eDrawType_TextHelvetica, x, (curve->cd->cols+0.8) + 0.75, glow_eDrawType_TextHelvetica,
glow_eDrawType_Line, 2, glow_eFont_Helvetica, glow_eDrawType_Line, 2, glow_eFont_LucidaSans,
glow_mDisplayLevel_1, NULL, &t1); glow_mDisplayLevel_1, NULL, &t1);
// Draw button for scale // Draw button for scale
x += 2; x += 2;
...@@ -711,8 +747,8 @@ int GeCurve::init_grownames_cb( GlowCtx *fctx, void *client_data) ...@@ -711,8 +747,8 @@ int GeCurve::init_grownames_cb( GlowCtx *fctx, void *client_data)
// Draw attribute name // Draw attribute name
x += 3; x += 3;
grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Time axis"), grow_CreateGrowText( curve->grownames_ctx, "", Lng::translate("Time axis"),
x, (curve->cd->cols+0.8) + 0.75, glow_eDrawType_TextHelveticaBold, x, (curve->cd->cols+0.8) + 0.75, glow_eDrawType_TextHelvetica,
glow_eDrawType_Line, 2, glow_eFont_Helvetica, glow_eDrawType_Line, 2, glow_eFont_LucidaSans,
glow_mDisplayLevel_1, NULL, &t1); glow_mDisplayLevel_1, NULL, &t1);
grow_SetAnnotation( curve->cursor_annot[curve->cd->cols], 0, "0", 1); grow_SetAnnotation( curve->cursor_annot[curve->cd->cols], 0, "0", 1);
grow_SetAnnotation( curve->mark_annot[curve->cd->cols], 0, "0", 1); grow_SetAnnotation( curve->mark_annot[curve->cd->cols], 0, "0", 1);
...@@ -827,85 +863,166 @@ int GeCurve::configure_axes() ...@@ -827,85 +863,166 @@ int GeCurve::configure_axes()
int GeCurve::configure_curves() int GeCurve::configure_curves()
{ {
int i, idx; int i, j, idx;
glow_sCurveData gcd; glow_sCurveData gcd;
int max_index, min_index; int max_index, min_index;
double minval, maxval; double minval, maxval;
gcd.type = glow_eCurveDataType_CommonX; if ( cd->type == curve_eDataType_LogFile ||
cd->type == curve_eDataType_DsTrend) {
// Get max and min index in x gcd.type = glow_eCurveDataType_CommonX;
max_index = -1;
min_index = -1; // Get max and min index in x
if ( cd->x_min_value_axis[0] > cd->x_min_value[0] || max_index = -1;
cd->x_max_value_axis[0] < cd->x_max_value[0]) { min_index = -1;
for ( i = 0; i < cd->rows; i++) { if ( cd->x_min_value_axis[0] > cd->x_min_value[0] ||
if ( min_index == -1 && cd->x_data[0][i] >= cd->x_min_value_axis[0] ) cd->x_max_value_axis[0] < cd->x_max_value[0]) {
min_index = i; for ( i = 0; i < cd->rows[0]; i++) {
if ( max_index == -1 && cd->x_data[0][i] >= cd->x_max_value_axis[0] ) if ( min_index == -1 && cd->x_data[0][i] >= cd->x_min_value_axis[0] )
max_index = i - 1; min_index = i;
if ( max_index == -1 && cd->x_data[0][i] >= cd->x_max_value_axis[0] )
max_index = i - 1;
}
if ( min_index == -1)
min_index = 0;
if ( max_index == -1)
max_index = cd->rows[0] - 1;
} }
if ( min_index == -1) else {
max_index = cd->rows[0] - 1;
min_index = 0; min_index = 0;
if ( max_index == -1) }
max_index = cd->rows - 1;
}
else {
max_index = cd->rows - 1;
min_index = 0;
}
idx = 0; idx = 0;
for ( i = 0; i < cd->cols; i++) { for ( i = 0; i < cd->cols; i++) {
if ( !hide[i]) { if ( !hide[i]) {
gcd.y_max_value[idx] = cd->y_max_value_axis[i]; gcd.y_max_value[idx] = cd->y_max_value_axis[i];
gcd.y_min_value[idx] = cd->y_min_value_axis[i]; gcd.y_min_value[idx] = cd->y_min_value_axis[i];
gcd.y_data[idx] = &cd->y_data[i][min_index]; gcd.y_data[idx] = &cd->y_data[i][min_index];
gcd.color[idx] = cd->color[i]; gcd.color[idx] = cd->color[i];
gcd.fillcolor[idx] = cd->fillcolor[i]; gcd.fillcolor[idx] = cd->fillcolor[i];
idx++; idx++;
if ( idx == TREND_MAX_CURVES - 1) if ( idx == TREND_MAX_CURVES - 1)
break;
}
}
gcd.x_data[0] = &cd->x_data[0][min_index];
gcd.x_max_value[0] = cd->x_max_value_axis[0];
gcd.x_min_value[0] = cd->x_min_value_axis[0];
gcd.curves = idx;
gcd.rows[0] = max_index - min_index + 1;
gcd.x_reverse = cd->x_reverse;
// Get number of horizontal lines from first not hidden float
idx = 1;
for ( i = 0; i < cd->cols; i++) {
if ( cd->y_value_type[i] != pwr_eType_Boolean && !hide[i]) {
idx = i;
break; break;
}
}
grow_SetTrendLines( curve_object,
// int(cd->max_value_axis[0] - cd->min_value_axis[0] - 1),
cd->x_trend_lines[0] - 2,
2 * cd->y_trend_lines[idx] - 3);
if ( cd->x_reverse) {
minval = cd->x_max_value_axis[0];
maxval = cd->x_min_value_axis[0];
}
else {
minval = cd->x_min_value_axis[0];
maxval = cd->x_max_value_axis[0];
} }
}
gcd.x_data[0] = &cd->x_data[0][min_index];
gcd.x_max_value[0] = cd->x_max_value_axis[0];
gcd.x_min_value[0] = cd->x_min_value_axis[0];
gcd.curves = idx; grow_SetAxisConf( curve_axisobject, minval, maxval,
gcd.rows = max_index - min_index + 1; // 10 * int( cd->max_value_axis[0] - cd->min_value_axis[0]) + 1,
gcd.x_reverse = cd->x_reverse; cd->x_axis_lines[0],
cd->x_axis_linelongq[0], cd->x_axis_valueq[0], 270, cd->x_format[0]);
// Get number of horizontal lines from first not hidden float grow_CurveConfigure( curve_object, &gcd);
idx = 1;
for ( i = 0; i < cd->cols; i++) {
if ( cd->y_value_type[i] != pwr_eType_Boolean && !hide[i]) {
idx = i;
break;
}
} }
else if ( cd->type == curve_eDataType_MultiTrend) {
gcd.type = glow_eCurveDataType_SeparateX;
idx = 0;
for ( i = 0; i < cd->cols; i++) {
if ( !hide[i]) {
// Get max and min index in x
max_index = -1;
min_index = -1;
if ( cd->x_min_value_axis[i] > cd->x_min_value[i] ||
cd->x_max_value_axis[i] < cd->x_max_value[i]) {
for ( j = 0; j < cd->rows[i]; j++) {
if ( min_index == -1 && cd->x_data[i][j] >= cd->x_min_value_axis[i] )
min_index = j;
if ( max_index == -1 && cd->x_data[i][j] >= cd->x_max_value_axis[i] )
max_index = j - 1;
}
if ( min_index == -1)
min_index = 0;
if ( max_index == -1)
max_index = cd->rows[i] - 1;
}
else {
max_index = cd->rows[i] - 1;
min_index = 0;
}
grow_SetTrendLines( curve_object, gcd.y_max_value[idx] = cd->y_max_value_axis[i];
// int(cd->max_value_axis[0] - cd->min_value_axis[0] - 1), gcd.y_min_value[idx] = cd->y_min_value_axis[i];
cd->x_trend_lines[0] - 2, gcd.y_data[idx] = &cd->y_data[i][min_index];
2 * cd->y_trend_lines[idx] - 3); gcd.color[idx] = cd->color[i];
gcd.fillcolor[idx] = cd->fillcolor[i];
if ( cd->x_reverse) { gcd.x_data[idx] = &cd->x_data[i][min_index];
minval = cd->x_max_value_axis[0]; gcd.x_max_value[idx] = cd->x_max_value_axis[i];
maxval = cd->x_min_value_axis[0]; gcd.x_min_value[idx] = cd->x_min_value_axis[i];
} gcd.rows[idx] = max_index - min_index + 1;
else {
minval = cd->x_min_value_axis[0]; idx++;
maxval = cd->x_max_value_axis[0]; if ( idx == TREND_MAX_CURVES - 1)
} break;
}
}
gcd.curves = idx;
gcd.x_reverse = cd->x_reverse;
// Get number of horizontal lines from first not hidden float
idx = 1;
for ( i = 0; i < cd->cols; i++) {
if ( cd->y_value_type[i] != pwr_eType_Boolean && !hide[i]) {
idx = i;
break;
}
}
grow_SetTrendLines( curve_object,
// int(cd->max_value_axis[0] - cd->min_value_axis[0] - 1),
cd->x_trend_lines[0] - 2,
2 * cd->y_trend_lines[idx] - 3);
if ( cd->x_reverse) {
minval = cd->x_max_value_axis[0];
maxval = cd->x_min_value_axis[0];
}
else {
minval = cd->x_min_value_axis[0];
maxval = cd->x_max_value_axis[0];
}
grow_SetAxisConf( curve_axisobject, minval, maxval, grow_SetAxisConf( curve_axisobject, minval, maxval,
// 10 * int( cd->max_value_axis[0] - cd->min_value_axis[0]) + 1, // 10 * int( cd->max_value_axis[0] - cd->min_value_axis[0]) + 1,
cd->x_axis_lines[0], cd->x_axis_lines[0],
cd->x_axis_linelongq[0], cd->x_axis_valueq[0], 270, cd->x_format[0]); cd->x_axis_linelongq[0], cd->x_axis_valueq[0], 270, cd->x_format[0]);
grow_CurveConfigure( curve_object, &gcd); grow_CurveConfigure( curve_object, &gcd);
}
return 1; return 1;
} }
...@@ -927,7 +1044,7 @@ void GeCurve::points_added() ...@@ -927,7 +1044,7 @@ void GeCurve::points_added()
min_index = -1; min_index = -1;
if ( cd->x_min_value_axis[0] > cd->x_min_value[0] || if ( cd->x_min_value_axis[0] > cd->x_min_value[0] ||
cd->x_max_value_axis[0] < cd->x_max_value[0]) { cd->x_max_value_axis[0] < cd->x_max_value[0]) {
for ( i = 0; i < cd->rows; i++) { for ( i = 0; i < cd->rows[0]; i++) {
if ( min_index == -1 && cd->x_data[0][i] >= cd->x_min_value_axis[0] ) if ( min_index == -1 && cd->x_data[0][i] >= cd->x_min_value_axis[0] )
min_index = i; min_index = i;
if ( max_index == -1 && cd->x_data[0][i] >= cd->x_max_value_axis[0] ) if ( max_index == -1 && cd->x_data[0][i] >= cd->x_max_value_axis[0] )
...@@ -936,10 +1053,10 @@ void GeCurve::points_added() ...@@ -936,10 +1053,10 @@ void GeCurve::points_added()
if ( min_index == -1) if ( min_index == -1)
min_index = 0; min_index = 0;
if ( max_index == -1) if ( max_index == -1)
max_index = cd->rows - 1; max_index = cd->rows[0] - 1;
} }
else { else {
max_index = cd->rows - 1; max_index = cd->rows[0] - 1;
min_index = 0; min_index = 0;
} }
...@@ -960,7 +1077,7 @@ void GeCurve::points_added() ...@@ -960,7 +1077,7 @@ void GeCurve::points_added()
gcd.x_min_value[0] = cd->x_min_value_axis[0]; gcd.x_min_value[0] = cd->x_min_value_axis[0];
gcd.x_data[0] = &cd->x_data[0][min_index]; gcd.x_data[0] = &cd->x_data[0][min_index];
gcd.curves = idx; gcd.curves = idx;
gcd.rows = max_index - min_index + 1; gcd.rows[0] = max_index - min_index + 1;
gcd.x_reverse = cd->x_reverse; gcd.x_reverse = cd->x_reverse;
grow_CurveAddPoints( curve_object, &gcd); grow_CurveAddPoints( curve_object, &gcd);
...@@ -1021,7 +1138,7 @@ int GeCurve::read_file( char *filename) ...@@ -1021,7 +1138,7 @@ int GeCurve::read_file( char *filename)
cd->x_reverse = 0; cd->x_reverse = 0;
cd->cols = nr - 1; cd->cols = nr - 1;
cd->rows = rows; cd->rows[0] = rows;
for ( i = 0; i < nr; i++) { for ( i = 0; i < nr; i++) {
if ( i == 0) { if ( i == 0) {
strcpy( cd->x_name, item_str[i]); strcpy( cd->x_name, item_str[i]);
...@@ -1053,7 +1170,7 @@ int GeCurve::read_file( char *filename) ...@@ -1053,7 +1170,7 @@ int GeCurve::read_file( char *filename)
if ( i == 0) { if ( i == 0) {
printf( "Unreadble line %d\n", j); printf( "Unreadble line %d\n", j);
skip_line = 1; skip_line = 1;
cd->rows--; cd->rows[0]--;
break; break;
} }
else else
...@@ -1145,7 +1262,7 @@ GeCurve::GeCurve( void *gc_parent_ctx, ...@@ -1145,7 +1262,7 @@ GeCurve::GeCurve( void *gc_parent_ctx,
} }
GeCurveData::GeCurveData( curve_eDataType datatype) : GeCurveData::GeCurveData( curve_eDataType datatype) :
type(datatype), rows(0), cols(0), x_reverse(0), time_format(curve_eTimeFormat_Float) type(datatype), cols(0), x_reverse(0), time_format(curve_eTimeFormat_Float)
{ {
memset( x_data, 0, sizeof(x_data)); memset( x_data, 0, sizeof(x_data));
memset( y_data, 0, sizeof(y_data)); memset( y_data, 0, sizeof(y_data));
...@@ -1153,6 +1270,7 @@ GeCurveData::GeCurveData( curve_eDataType datatype) : ...@@ -1153,6 +1270,7 @@ GeCurveData::GeCurveData( curve_eDataType datatype) :
strcpy( y_unit[i], ""); strcpy( y_unit[i], "");
strcpy( y_format[i], ""); strcpy( y_format[i], "");
strcpy( y_name[i], ""); strcpy( y_name[i], "");
rows[i] = 0;
y_max_value[i] = 0; y_max_value[i] = 0;
y_min_value[i] = 0; y_min_value[i] = 0;
y_min_value_axis[i] = 0; y_min_value_axis[i] = 0;
...@@ -1195,7 +1313,7 @@ void GeCurveData::get_borders() ...@@ -1195,7 +1313,7 @@ void GeCurveData::get_borders()
y_value_type[i] = pwr_eType_Boolean; y_value_type[i] = pwr_eType_Boolean;
for ( int j = 0; j < rows; j++) { for ( int j = 0; j < rows[i]; j++) {
if ( y_data[i][j] < y_min_value[i]) if ( y_data[i][j] < y_min_value[i])
y_min_value[i] = y_data[i][j]; y_min_value[i] = y_data[i][j];
if ( y_data[i][j] > y_max_value[i]) if ( y_data[i][j] > y_max_value[i])
...@@ -1207,17 +1325,35 @@ void GeCurveData::get_borders() ...@@ -1207,17 +1325,35 @@ void GeCurveData::get_borders()
} }
} }
} }
for ( int i = 0; i < 1; i++) {
x_max_value[i] = 1e-37;
x_min_value[i] = 1e37;
x_value_type[i] = pwr_eType_Float64; if ( type == curve_eDataType_MultiTrend) {
for ( int i = 0; i < cols; i++) {
x_max_value[i] = 1e-37;
x_min_value[i] = 1e37;
for ( int j = 0; j < rows; j++) { x_value_type[i] = pwr_eType_Float64;
if ( x_data[i][j] < x_min_value[i])
x_min_value[i] = x_data[i][j]; for ( int j = 0; j < rows[i]; j++) {
if ( x_data[i][j] > x_max_value[i]) if ( x_data[i][j] < x_min_value[i])
x_max_value[i] = x_data[i][j]; x_min_value[i] = x_data[i][j];
if ( x_data[i][j] > x_max_value[i])
x_max_value[i] = x_data[i][j];
}
}
}
else {
for ( int i = 0; i < 1; i++) {
x_max_value[i] = 1e-37;
x_min_value[i] = 1e37;
x_value_type[i] = pwr_eType_Float64;
for ( int j = 0; j < rows[0]; j++) {
if ( x_data[i][j] < x_min_value[i])
x_min_value[i] = x_data[i][j];
if ( x_data[i][j] > x_max_value[i])
x_max_value[i] = x_data[i][j];
}
} }
} }
} }
...@@ -1234,10 +1370,32 @@ void GeCurveData::get_default_axis() ...@@ -1234,10 +1370,32 @@ void GeCurveData::get_default_axis()
} }
int i = 0; int i = 0;
double axis_width; double axis_width;
scale( x_axis_type[i], x_value_type[i], x_min_value[i], x_max_value[i],
&x_min_value_axis[i], &x_max_value_axis[i], &x_trend_lines[i], &x_axis_lines[i], if ( type != curve_eDataType_MultiTrend) {
&x_axis_linelongq[i], &x_axis_valueq[i], x_format[i], scale( x_axis_type[i], x_value_type[i], x_min_value[i], x_max_value[i],
&axis_width, 0, 0); &x_min_value_axis[i], &x_max_value_axis[i], &x_trend_lines[i], &x_axis_lines[i],
&x_axis_linelongq[i], &x_axis_valueq[i], x_format[i],
&axis_width, 0, 0);
}
else {
double min_value = 1e37;
double max_value = -1e37;
for ( i = 0; i < cols; i++) {
if ( x_min_value[i] < min_value)
min_value = x_min_value[i];
if ( x_max_value[i] > max_value)
max_value = x_max_value[i];
}
scale( x_axis_type[0], x_value_type[0], min_value, max_value,
&x_min_value_axis[0], &x_max_value_axis[0], &x_trend_lines[0], &x_axis_lines[0],
&x_axis_linelongq[0], &x_axis_valueq[0], x_format[0],
&axis_width, 0, 0);
for ( i = 1; i < cols; i++) {
x_min_value_axis[i] = x_min_value_axis[0];
x_max_value_axis[i] = x_max_value_axis[0];
}
}
} }
void GeCurveData::select_color( bool dark_bg) void GeCurveData::select_color( bool dark_bg)
...@@ -1382,7 +1540,8 @@ void GeCurveData::scale( int axis_type, int value_type, ...@@ -1382,7 +1540,8 @@ void GeCurveData::scale( int axis_type, int value_type,
} }
else { else {
n = 0; n = 0;
if ( (type == curve_eDataType_LogFile || type == curve_eDataType_DsTrend) if ( (type == curve_eDataType_LogFile || type == curve_eDataType_DsTrend ||
type == curve_eDataType_MultiTrend)
&& axis_type == curve_eAxis_x) { && axis_type == curve_eAxis_x) {
// Time axis // Time axis
if ( max_value - min_value < 300) { if ( max_value - min_value < 300) {
...@@ -1658,59 +1817,119 @@ void GeCurve::x_to_points( double x, double *t, double *values) ...@@ -1658,59 +1817,119 @@ void GeCurve::x_to_points( double x, double *t, double *values)
int row; int row;
double time; double time;
// Time is a date if ( cd->type != curve_eDataType_MultiTrend) {
if ( !cd->x_reverse) // Time is a date
time = cd->x_min_value_axis[0] + x * if ( !cd->x_reverse)
(cd->x_max_value_axis[0] - cd->x_min_value_axis[0]) / 200; time = cd->x_min_value_axis[0] + x *
else (cd->x_max_value_axis[0] - cd->x_min_value_axis[0]) / 200;
time = cd->x_min_value_axis[0] + (200.0 - x) * else
(cd->x_max_value_axis[0] - cd->x_min_value_axis[0]) / 200; time = cd->x_min_value_axis[0] + (200.0 - x) *
(cd->x_max_value_axis[0] - cd->x_min_value_axis[0]) / 200;
// Approximate row // Approximate row
row = int ((time - cd->x_min_value[0]) / row = int ((time - cd->x_min_value[0]) /
(cd->x_max_value[0] - cd->x_min_value[0]) * (cd->x_max_value[0] - cd->x_min_value[0]) *
(cd->rows - 1) + 0.5); (cd->rows[0] - 1) + 0.5);
if ( row > cd->rows - 1) if ( row > cd->rows[0] - 1)
row = cd->rows - 1; row = cd->rows[0] - 1;
else if ( row < 0) else if ( row < 0)
row = 0; row = 0;
else { else {
// Find exact row // Find exact row
double b1, b2; double b1, b2;
int r = row; int r = row;
for (int i = 0;; i++) { for (int i = 0;; i++) {
if ( r == 0) { if ( r == 0) {
b2 = (cd->x_data[0][row] + cd->x_data[0][r+1]) / 2; b2 = (cd->x_data[0][row] + cd->x_data[0][r+1]) / 2;
if ( time < b2) if ( time < b2)
break; break;
r++;
}
else if ( r == cd->rows - 1) {
b1 = (cd->x_data[0][r] + cd->x_data[0][r-1]) / 2;
if ( time >= b1)
break;
r--;
}
else {
b1 = (cd->x_data[0][r] + cd->x_data[0][r-1]) / 2;
b2 = (cd->x_data[0][r] + cd->x_data[0][r+1]) / 2;
if ( b1 <= time && time < b2)
break;
if ( b1 <= time)
r++; r++;
else }
else if ( r == cd->rows[0] - 1) {
b1 = (cd->x_data[0][r] + cd->x_data[0][r-1]) / 2;
if ( time >= b1)
break;
r--; r--;
}
else {
b1 = (cd->x_data[0][r] + cd->x_data[0][r-1]) / 2;
b2 = (cd->x_data[0][r] + cd->x_data[0][r+1]) / 2;
if ( b1 <= time && time < b2)
break;
if ( b1 <= time)
r++;
else
r--;
}
if ( i > cd->rows[0]) {
// Corrupt data, se original row
r = row;
break;
}
} }
if ( i > cd->rows) { row = r;
// Corrupt data, se original row
r = row;
break;
}
} }
row = r; for ( int i = 0; i < cd->cols; i++)
values[i] = cd->y_data[i][row];
*t = cd->x_data[0][row];
} }
for ( int i = 0; i < cd->cols; i++) else {
values[i] = cd->y_data[i][row]; // Time is a date
if ( !cd->x_reverse)
time = cd->x_min_value_axis[0] + x *
(cd->x_max_value_axis[0] - cd->x_min_value_axis[0]) / 200;
else
time = cd->x_min_value_axis[0] + (200.0 - x) *
(cd->x_max_value_axis[0] - cd->x_min_value_axis[0]) / 200;
*t = cd->x_data[0][row]; // Approximate row
for ( int j = 0; j < cd->cols; j++) {
row = int ((time - cd->x_min_value[j]) /
(cd->x_max_value[j] - cd->x_min_value[j]) *
(cd->rows[j] - 1) + 0.5);
if ( row > cd->rows[j] - 1)
row = cd->rows[j] - 1;
else if ( row < 0)
row = 0;
else {
// Find exact row
double b1, b2;
int r = row;
for (int i = 0;; i++) {
if ( r == 0) {
b2 = (cd->x_data[j][row] + cd->x_data[j][r+1]) / 2;
if ( time < b2)
break;
r++;
}
else if ( r == cd->rows[j] - 1) {
b1 = (cd->x_data[j][r] + cd->x_data[0][r-1]) / 2;
if ( time >= b1)
break;
r--;
}
else {
b1 = (cd->x_data[j][r] + cd->x_data[j][r-1]) / 2;
b2 = (cd->x_data[j][r] + cd->x_data[j][r+1]) / 2;
if ( b1 <= time && time < b2)
break;
if ( b1 <= time)
r++;
else
r--;
}
if ( i > cd->rows[j]) {
// Corrupt data, se original row
r = row;
break;
}
}
row = r;
}
values[j] = cd->y_data[j][row];
if ( j == 0)
*t = cd->x_data[j][row];
}
}
} }
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
typedef enum { typedef enum {
curve_eDataType_LogFile, curve_eDataType_LogFile,
curve_eDataType_DsTrend, curve_eDataType_DsTrend,
curve_eDataType_MultiTrend,
curve_eDataType_ODBC curve_eDataType_ODBC
} curve_eDataType; } curve_eDataType;
...@@ -56,7 +57,7 @@ class GeCurveData { ...@@ -56,7 +57,7 @@ class GeCurveData {
public: public:
GeCurveData( curve_eDataType datatype); GeCurveData( curve_eDataType datatype);
curve_eDataType type; curve_eDataType type;
int rows; int rows[CURVE_MAX_COLS];
int cols; int cols;
pwr_tAName y_name[CURVE_MAX_COLS]; pwr_tAName y_name[CURVE_MAX_COLS];
pwr_tAName x_name; pwr_tAName x_name;
......
...@@ -1979,7 +1979,7 @@ typedef enum { ...@@ -1979,7 +1979,7 @@ typedef enum {
typedef struct { typedef struct {
glow_eCurveDataType type; glow_eCurveDataType type;
int curves; //!< Number of curves int curves; //!< Number of curves
int rows; //!< Number of points int rows[TREND_MAX_CURVES]; //!< Number of points
int x_reverse; //!< Reverse the curves when drawing them int x_reverse; //!< Reverse the curves when drawing them
double y_max_value[TREND_MAX_CURVES]; //!< Max value for every curve double y_max_value[TREND_MAX_CURVES]; //!< Max value for every curve
double x_max_value[TREND_MAX_CURVES]; //!< Max value for every curve double x_max_value[TREND_MAX_CURVES]; //!< Max value for every curve
......
...@@ -65,7 +65,7 @@ void GrowCurve::configure_curves( glow_sCurveData *data) ...@@ -65,7 +65,7 @@ void GrowCurve::configure_curves( glow_sCurveData *data)
if ( data->type == glow_eCurveDataType_CommonX) { if ( data->type == glow_eCurveDataType_CommonX) {
curve_cnt = data->curves; curve_cnt = data->curves;
no_of_points = data->rows; no_of_points = data->rows[0];
for ( i = 0; i < curve_cnt; i++) { for ( i = 0; i < curve_cnt; i++) {
y_max_value[i] = data->y_max_value[i]; y_max_value[i] = data->y_max_value[i];
...@@ -162,6 +162,111 @@ void GrowCurve::configure_curves( glow_sCurveData *data) ...@@ -162,6 +162,111 @@ void GrowCurve::configure_curves( glow_sCurveData *data)
} }
free( (char *) pointarray); free( (char *) pointarray);
draw();
}
else if ( data->type == glow_eCurveDataType_SeparateX) {
curve_cnt = data->curves;
no_of_points = data->rows[0];
for ( i = 0; i < curve_cnt; i++) {
y_max_value[i] = data->y_max_value[i];
y_min_value[i] = data->y_min_value[i];
curve_drawtype[i] = data->color[i];
curve_fill_drawtype[i] = data->fillcolor[i];
}
curve_width = min( DRAW_TYPE_SIZE, max( 1, curve_width));
for ( idx = 0; idx < curve_cnt; idx++) {
points = data->rows[idx];
if ( fill_curve)
points += 2;
pointarray = (glow_sPoint *) calloc( points, sizeof(glow_sPoint));
point_p = pointarray;
for ( i = 0; i < points; i++) {
if ( !fill_curve) {
if ( data->x_reverse)
x_value = ur.x - (data->x_data[idx][i] - data->x_min_value[idx]) /
(data->x_max_value[idx] - data->x_min_value[idx]) * (ur.x - ll.x);
else
x_value = ll.x + (data->x_data[idx][i] - data->x_min_value[idx]) /
(data->x_max_value[idx] - data->x_min_value[idx]) * (ur.x - ll.x);
x_value = max( ll.x, min( x_value, ur.x));
y_value = ur.y - (data->y_data[idx][i] - y_min_value[idx]) /
(y_max_value[idx] - y_min_value[idx]) * (ur.y - ll.y);
y_value = max( ll.y, min( y_value, ur.y));
point_p->y = y_value;
point_p->x = x_value;
}
else {
if ( i == 0) {
point_p->y = ur.y;
// point_p->x = ur.x;
if ( data->x_reverse)
point_p->x = ur.x - (data->x_data[idx][i] - data->x_min_value[idx]) /
(data->x_max_value[idx] - data->x_min_value[idx]) * (ur.x - ll.x);
else
point_p->x = ll.x + (data->x_data[0][i] - data->x_min_value[0]) /
(data->x_max_value[idx] - data->x_min_value[idx]) * (ur.x - ll.x);
}
else if ( i == points - 1) {
point_p->y = ur.y;
if ( data->x_reverse)
point_p->x = ur.x - (data->x_data[0][i-2] - data->x_min_value[0]) /
(data->x_max_value[idx] - data->x_min_value[idx]) * (ur.x - ll.x);
else
point_p->x = ll.x + (data->x_data[0][i-2] - data->x_min_value[0]) /
(data->x_max_value[idx] - data->x_min_value[idx]) * (ur.x - ll.x);
// point_p->x = ll.x;
}
else {
if ( data->x_reverse)
x_value = ur.x - (data->x_data[idx][i-1] - data->x_min_value[idx]) /
(data->x_max_value[idx] - data->x_min_value[idx]) * (ur.x - ll.x);
else
x_value = ll.x + (data->x_data[idx][i-1] - data->x_min_value[idx]) /
(data->x_max_value[idx] - data->x_min_value[idx]) * (ur.x - ll.x);
x_value = max( ll.x, min( x_value, ur.x));
y_value = ur.y - (data->y_data[idx][i-1] - y_min_value[idx]) /
(y_max_value[idx] - y_min_value[idx]) * (ur.y - ll.y);
y_value = max( ll.y, min( y_value, ur.y));
point_p->y = y_value;
point_p->x = x_value;
}
}
point_p++;
}
if ( curve_drawtype[idx] != glow_eDrawType_Inherit)
dt = curve_drawtype[idx];
else
dt = draw_type;
if ( curve_fill_drawtype[idx] != glow_eDrawType_Inherit)
dt_fill = curve_fill_drawtype[idx];
else
dt_fill = draw_type;
ctx->nodraw++;
curve[idx] = new GrowPolyLine( ctx, "", pointarray, points, dt,
curve_width,
0, fill_curve, 1, 0, dt_fill);
ctx->nodraw--;
free( (char *) pointarray);
}
draw(); draw();
} }
} }
......
...@@ -45,14 +45,17 @@ ...@@ -45,14 +45,17 @@
XttSevHistGtk::XttSevHistGtk( void *parent_ctx, XttSevHistGtk::XttSevHistGtk( void *parent_ctx,
GtkWidget *parent_wid, GtkWidget *parent_wid,
const char *name, const char *name,
GtkWidget **w, GtkWidget **w,
pwr_tOid *xn_oid, pwr_tOid *xn_oidv,
pwr_tOName *xn_aname, pwr_tOName *xn_anamev,
sevcli_tCtx xn_scctx, pwr_tOName *xn_onamev,
int *sts, bool sevhistobject) : bool *sevhistobjectv,
XttSevHist( parent_ctx, name, xn_oid, xn_aname, xn_scctx, sts, sevhistobject), parent_widget(parent_wid) sevcli_tCtx xn_scctx,
int *sts) :
XttSevHist( parent_ctx, name, xn_oidv, xn_anamev, xn_onamev, sevhistobjectv, xn_scctx, sts),
parent_widget(parent_wid)
{ {
char title[250]; char title[250];
strncpy(title, name, sizeof(title)); strncpy(title, name, sizeof(title));
......
...@@ -31,14 +31,15 @@ class XttSevHistGtk : public XttSevHist { ...@@ -31,14 +31,15 @@ class XttSevHistGtk : public XttSevHist {
GtkWidget *parent_widget; //!< Parent widget. GtkWidget *parent_widget; //!< Parent widget.
XttSevHistGtk( void *xn_parent_ctx, XttSevHistGtk( void *xn_parent_ctx,
GtkWidget *xn_parent_wid, GtkWidget *xn_parent_wid,
const char *xn_name, const char *xn_name,
GtkWidget **w, GtkWidget **w,
pwr_tOid *xn_oid, pwr_tOid *xn_oidv,
pwr_tOName *xn_aname, pwr_tOName *xn_anamev,
sevcli_tCtx xn_scctx, pwr_tOName *xn_onamev,
int *sts, bool *sevhistobjectv,
bool sevhistobject); sevcli_tCtx xn_scctx,
int *sts);
~XttSevHistGtk(); ~XttSevHistGtk();
}; };
......
...@@ -223,12 +223,12 @@ XttTrend *XNavGtk::xtttrend_new( char *name, pwr_tAttrRef *objar, pwr_tAttrRef * ...@@ -223,12 +223,12 @@ XttTrend *XNavGtk::xtttrend_new( char *name, pwr_tAttrRef *objar, pwr_tAttrRef *
return new XttTrendGtk( this, parent_wid, name, &w, objar, plotgroup, sts); return new XttTrendGtk( this, parent_wid, name, &w, objar, plotgroup, sts);
} }
XttSevHist *XNavGtk::xttsevhist_new( char *name, pwr_tOid *oid, pwr_tOName *aname, XttSevHist *XNavGtk::xttsevhist_new( char *name, pwr_tOid *oidv, pwr_tOName *anamev, pwr_tOName *onamev,
sevcli_tCtx scctx, pwr_tStatus *sts, bool sevhistobject) bool *sevhistobjectv, sevcli_tCtx scctx, pwr_tStatus *sts)
{ {
GtkWidget *w; GtkWidget *w;
return new XttSevHistGtk( this, parent_wid, name, &w, oid, aname, scctx, sts, sevhistobject); return new XttSevHistGtk( this, parent_wid, name, &w, oidv, anamev, onamev, sevhistobjectv, scctx, sts);
} }
XttFast *XNavGtk::xttfast_new( char *name, pwr_tAttrRef *objar, pwr_tStatus *sts) XttFast *XNavGtk::xttfast_new( char *name, pwr_tAttrRef *objar, pwr_tStatus *sts)
......
...@@ -58,8 +58,9 @@ class XNavGtk : public XNav { ...@@ -58,8 +58,9 @@ class XNavGtk : public XNav {
Op *op_new( char *opplace, pwr_tStatus *sts); Op *op_new( char *opplace, pwr_tStatus *sts);
XttTrend *xtttrend_new( char *name, pwr_tAttrRef *objar, pwr_tAttrRef *plotgroup, XttTrend *xtttrend_new( char *name, pwr_tAttrRef *objar, pwr_tAttrRef *plotgroup,
pwr_tStatus *sts); pwr_tStatus *sts);
XttSevHist *xttsevhist_new( char *name, pwr_tOid *oid, pwr_tOName *aname, XttSevHist *xttsevhist_new( char *name, pwr_tOid *oidv, pwr_tOName *anamev,
sevcli_tCtx scctx, pwr_tStatus *sts, bool sevhistobject=false); pwr_tOName *onamev, bool *sevhistobjectv, sevcli_tCtx scctx,
pwr_tStatus *sts);
XttFast *xttfast_new( char *name, pwr_tAttrRef *objar, pwr_tStatus *sts); XttFast *xttfast_new( char *name, pwr_tAttrRef *objar, pwr_tStatus *sts);
XAttOne *xattone_new( pwr_tAttrRef *objar, char *title, unsigned int priv, XAttOne *xattone_new( pwr_tAttrRef *objar, char *title, unsigned int priv,
pwr_tStatus *sts); pwr_tStatus *sts);
......
...@@ -152,9 +152,9 @@ XttFast::XttFast( void *parent_ctx, ...@@ -152,9 +152,9 @@ XttFast::XttFast( void *parent_ctx,
default: default:
element_size[i] = 4; element_size[i] = 4;
} }
gcd->rows[i] = max_points;
} }
gcd->cols = fast_cnt; gcd->cols = fast_cnt;
gcd->rows = max_points;
axis_configured = true; axis_configured = true;
for ( i = 0; i < FAST_CURVES; i++) { for ( i = 0; i < FAST_CURVES; i++) {
......
...@@ -46,20 +46,36 @@ ...@@ -46,20 +46,36 @@
XttSevHist::XttSevHist( void *parent_ctx, XttSevHist::XttSevHist( void *parent_ctx,
const char *name, const char *name,
pwr_tOid *xn_oid, pwr_tOid *xn_oidv,
pwr_tOName *xn_aname, pwr_tOName *xn_anamev,
sevcli_tCtx xn_scctx, pwr_tOName *xn_onamev,
int *sts, bool *xn_sevhistobjectv,
bool sevhistobject) : sevcli_tCtx xn_scctx,
int *sts) :
xnav(parent_ctx), gcd(0), curve(0), rows(0), vsize(0), timerid(0), close_cb(0), help_cb(0), xnav(parent_ctx), gcd(0), curve(0), rows(0), vsize(0), timerid(0), close_cb(0), help_cb(0),
first_scan(1), scctx(xn_scctx), oid(xn_oid[0]), time_low_old(0), time_high_old(0), sevhistobject(sevhistobject) first_scan(1), scctx(xn_scctx), time_low_old(0), time_high_old(0)
{ {
strncpy( aname, xn_aname[0], sizeof(aname));
get_data( sts, pwr_cNTime, pwr_cNTime); // Count number of curves
if ( EVEN(*sts)) return; for ( oid_cnt = 0; xn_oidv[oid_cnt].vid != 0; oid_cnt++) ;
if ( oid_cnt > XTT_SEVHIST_MAX)
oid_cnt = XTT_SEVHIST_MAX;
memcpy( oidv, xn_oidv, oid_cnt * sizeof(oidv[0]));
memcpy( anamev, xn_anamev, oid_cnt * sizeof(anamev[0]));
memcpy( onamev, xn_onamev, oid_cnt * sizeof(onamev[0]));
memcpy( sevhistobjectv, xn_sevhistobjectv, oid_cnt * sizeof(sevhistobjectv[0]));
if ( oid_cnt == 1) {
get_data( sts, pwr_cNTime, pwr_cNTime);
if ( EVEN(*sts)) return;
}
else {
get_multidata( sts, pwr_cNTime, pwr_cNTime);
if ( EVEN(*sts)) return;
}
cdh_StrncpyCutOff( title, name, sizeof(title), 1); cdh_StrncpyCutOff( title, name, sizeof(title), 1);
} }
...@@ -71,19 +87,20 @@ XttSevHist::~XttSevHist() ...@@ -71,19 +87,20 @@ XttSevHist::~XttSevHist()
int XttSevHist::get_data( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to) int XttSevHist::get_data( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to)
{ {
if( sevhistobject ) { if( sevhistobjectv[0]) {
return get_objectdata(sts, from, to); return get_objectdata(sts, from, to);
} }
pwr_tTime *tbuf; pwr_tTime *tbuf;
void *vbuf; void *vbuf;
pwr_tDeltaTime trange; pwr_tDeltaTime trange;
sevcli_get_itemdata( sts, scctx, oid, aname, from, to, 1000, &tbuf, &vbuf, sevcli_get_itemdata( sts, scctx, oidv[0], anamev[0], from, to, 1000, &tbuf, &vbuf,
&rows, &vtype, &vsize); &rows, &vtype, &vsize);
if ( EVEN(*sts)) if ( EVEN(*sts))
return 0; return 0;
if( rows == 0 ) { if( rows == 0 ) {
*sts = SEV__NODATATIME;
return 0; return 0;
} }
...@@ -98,7 +115,7 @@ int XttSevHist::get_data( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to) ...@@ -98,7 +115,7 @@ int XttSevHist::get_data( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to)
gcd->x_axis_type[0] = curve_eAxis_x; gcd->x_axis_type[0] = curve_eAxis_x;
strcpy( gcd->x_format[0], "%10t"); strcpy( gcd->x_format[0], "%10t");
strcpy( gcd->y_name[0], aname); strcpy( gcd->y_name[0], anamev[0]);
gcd->y_data[0] = (double *) calloc( 1, 8 * rows); gcd->y_data[0] = (double *) calloc( 1, 8 * rows);
for ( int i = 0; i < rows; i++) { for ( int i = 0; i < rows; i++) {
...@@ -147,7 +164,7 @@ int XttSevHist::get_data( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to) ...@@ -147,7 +164,7 @@ int XttSevHist::get_data( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to)
gcd->y_axis_type[0] = curve_eAxis_y; gcd->y_axis_type[0] = curve_eAxis_y;
gcd->cols = 1; gcd->cols = 1;
gcd->rows = rows; gcd->rows[0] = rows;
gcd->get_borders(); gcd->get_borders();
gcd->get_default_axis(); gcd->get_default_axis();
...@@ -184,12 +201,13 @@ int XttSevHist::get_objectdata( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to) ...@@ -184,12 +201,13 @@ int XttSevHist::get_objectdata( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to)
pwr_tDeltaTime trange; pwr_tDeltaTime trange;
sevcli_get_objectitemdata( sts, scctx, oid, aname, from, to, 1000, &tbuf, &vbuf, sevcli_get_objectitemdata( sts, scctx, oidv[0], anamev[0], from, to, 1000, &tbuf, &vbuf,
&rows, &histattrbuf, &numAttributes); &rows, &histattrbuf, &numAttributes);
if ( EVEN(*sts)) if ( EVEN(*sts))
return 0; return 0;
if( rows == 0 ) { if( rows == 0 ) {
*sts = SEV__NODATATIME;
return 0; return 0;
} }
...@@ -295,7 +313,252 @@ int XttSevHist::get_objectdata( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to) ...@@ -295,7 +313,252 @@ int XttSevHist::get_objectdata( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to)
gcd->rows = rows; for ( int i = 0; i < gcd->cols; i++)
gcd->rows[i] = rows;
gcd->get_borders();
gcd->get_default_axis();
if ( to.tv_sec != 0 && from.tv_sec != 0) {
time_Adiff( &trange, &to, &from);
if ( time_DToFloat( 0, &trange) < 600)
strcpy( gcd->x_format[0], "%10t");
else
strcpy( gcd->x_format[0], "%11t");
}
else
strcpy( gcd->x_format[0], "%11t");
gcd->select_color( 0);
if ( curve) {
curve->set_curvedata( gcd); // This will free the old gcd
curve->configure_curves();
curve->configure_axes();
curve->redraw();
}
*sts = SEV__SUCCESS;
return 1;
}
int XttSevHist::get_multidata( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to)
{
pwr_tTime *tbuf;
void *vbuf;
pwr_tDeltaTime trange;
int curve_cnt = 0;
// Create data for time axis
gcd = new GeCurveData( curve_eDataType_MultiTrend);
strcpy( gcd->x_name, "Time");
for ( int k = 0; k < oid_cnt; k++) {
if ( curve_cnt >= CURVE_MAX_COLS) {
printf("To many columns for curve class max: %d\n", CURVE_MAX_COLS);
break;
}
if ( !sevhistobjectv[k]) {
sevcli_get_itemdata( sts, scctx, oidv[k], anamev[k], from, to, 1000, &tbuf, &vbuf,
&rows, &vtype, &vsize);
if ( EVEN(*sts))
return 0;
if ( rows == 0)
continue;
gcd->x_data[curve_cnt] = (double *) calloc( 1, 8 * rows);
for ( int i = 0; i < rows; i++)
gcd->x_data[curve_cnt][i] = (double)tbuf[i].tv_sec + (double)1e-9 * tbuf[i].tv_nsec;
gcd->x_axis_type[curve_cnt] = curve_eAxis_x;
strcpy( gcd->x_format[curve_cnt], "%10t");
strcpy( gcd->y_name[curve_cnt], onamev[k]);
if ( strcmp( onamev[k], "") != 0)
strcat( gcd->y_name[curve_cnt], ".");
strcat( gcd->y_name[curve_cnt], anamev[k]);
gcd->y_data[curve_cnt] = (double *) calloc( 1, 8 * rows);
for ( int i = 0; i < rows; i++) {
switch ( vtype) {
case pwr_eType_Int64:
gcd->y_data[curve_cnt][i] = ((pwr_tInt32 *)vbuf)[i];
break;
case pwr_eType_Int32:
gcd->y_data[curve_cnt][i] = ((pwr_tInt32 *)vbuf)[i];
break;
case pwr_eType_Int16:
gcd->y_data[curve_cnt][i] = ((pwr_tInt32 *)vbuf)[i];
break;
case pwr_eType_Int8:
gcd->y_data[curve_cnt][i] = ((pwr_tInt32 *)vbuf)[i];
break;
case pwr_eType_UInt64:
gcd->y_data[curve_cnt][i] = ((pwr_tUInt32 *)vbuf)[i];
break;
case pwr_eType_UInt32:
gcd->y_data[curve_cnt][i] = ((pwr_tUInt32 *)vbuf)[i];
break;
case pwr_eType_UInt16:
gcd->y_data[curve_cnt][i] = ((pwr_tUInt32 *)vbuf)[i];
break;
case pwr_eType_UInt8:
gcd->y_data[curve_cnt][i] = ((pwr_tUInt32 *)vbuf)[i];
break;
case pwr_eType_Float32:
gcd->y_data[curve_cnt][i] = ((pwr_tFloat32 *)vbuf)[i];
break;
case pwr_eType_Float64:
gcd->y_data[curve_cnt][i] = ((pwr_tFloat64 *)vbuf)[i];
break;
case pwr_eType_Boolean:
gcd->y_data[curve_cnt][i] = ((pwr_tBoolean *)vbuf)[i];
break;
default:
*sts = SEV__CURVETYPE;
return 0;
}
}
free( tbuf);
free( vbuf);
gcd->y_axis_type[curve_cnt] = curve_eAxis_y;
gcd->rows[curve_cnt] = rows;
curve_cnt++;
}
else {
// SevHistObject object
sevcli_sHistAttr *histattrbuf;
int numAttributes;
sevcli_get_objectitemdata( sts, scctx, oidv[k], anamev[k], from, to, 1000, &tbuf, &vbuf,
&rows, &histattrbuf, &numAttributes);
if ( EVEN(*sts))
return 0;
if ( rows == 0)
continue;
gcd->x_data[curve_cnt] = (double *) calloc( 1, 8 * rows);
for ( int i = 0; i < rows; i++)
gcd->x_data[curve_cnt][i] = (double)tbuf[i].tv_sec + (double)1e-9 * tbuf[i].tv_nsec;
strcpy( gcd->x_name, "Time");
gcd->x_axis_type[curve_cnt] = curve_eAxis_x;
strcpy( gcd->x_format[0], "%10t");
//todo linesize br vi kunna f frn sevcli_get_objectitemdata
int linesize = 0;
for ( int i = 0; i < numAttributes; i++) {
linesize += histattrbuf[i].size;
}
void *dataptr = vbuf;
int tmp = 0;
for ( int i = 0; i < numAttributes; i++) {
gcd->x_data[curve_cnt] = (double *) calloc( 1, 8 * rows);
for ( int j = 0; j < rows; j++)
gcd->x_data[curve_cnt][j] = (double)tbuf[j].tv_sec + (double)1e-9 * tbuf[j].tv_nsec;
strcpy( gcd->x_name, "Time");
gcd->x_axis_type[curve_cnt] = curve_eAxis_x;
strcpy( gcd->x_format[curve_cnt], "%10t");
switch ( histattrbuf[i].type ) {
case pwr_eType_Int64:
case pwr_eType_Int32:
case pwr_eType_Int16:
case pwr_eType_Int8:
case pwr_eType_UInt64:
case pwr_eType_UInt32:
case pwr_eType_UInt16:
case pwr_eType_UInt8:
case pwr_eType_Float32:
case pwr_eType_Float64:
case pwr_eType_Boolean:
break;
default:
tmp += histattrbuf[i].size;
continue;
}
if ( curve_cnt >= CURVE_MAX_COLS) {
printf("To many columns for curve class max:%d\n", CURVE_MAX_COLS);
break;
}
strcpy( gcd->y_name[curve_cnt], onamev[k]);
if ( strcmp( onamev[k], "") != 0)
strcat( gcd->y_name[curve_cnt], ".");
strcat( gcd->y_name[curve_cnt], histattrbuf[i].aname);
gcd->y_data[curve_cnt] = (double *) calloc( 1, 8 * rows);
gcd->y_axis_type[curve_cnt] = curve_eAxis_y;
dataptr = (char *)vbuf + tmp;
for ( int j = 0; j < rows; j++) {
dataptr = ((char *)vbuf)+ j * linesize + tmp;
switch ( histattrbuf[i].type ) {
case pwr_eType_Int64:
gcd->y_data[curve_cnt][j] = *(pwr_tInt64 *)dataptr;
break;
case pwr_eType_Int32:
gcd->y_data[curve_cnt][j] = *(pwr_tInt32 *)dataptr;
break;
case pwr_eType_Int16:
gcd->y_data[curve_cnt][j] = *(pwr_tInt16 *)dataptr;
break;
case pwr_eType_Int8:
gcd->y_data[curve_cnt][j] = *(pwr_tInt8 *)dataptr;
break;
case pwr_eType_UInt64:
gcd->y_data[curve_cnt][j] = *(pwr_tUInt64 *)dataptr;
break;
case pwr_eType_UInt32:
gcd->y_data[curve_cnt][j] = *(pwr_tUInt32 *)dataptr;
break;
case pwr_eType_UInt16:
gcd->y_data[curve_cnt][j] = *(pwr_tUInt16 *)dataptr;
break;
case pwr_eType_UInt8:
gcd->y_data[curve_cnt][j] = *(pwr_tUInt8 *)dataptr;
break;
case pwr_eType_Float32:
gcd->y_data[curve_cnt][j] = *(pwr_tFloat32 *)dataptr;
break;
case pwr_eType_Float64:
gcd->y_data[curve_cnt][j] = *(pwr_tFloat64 *)dataptr;
break;
case pwr_eType_Boolean:
gcd->y_data[curve_cnt][j] = *(pwr_tBoolean *)dataptr;
break;
default:
*sts = SEV__CURVETYPE;
return 0;
}
}
tmp += histattrbuf[i].size;
gcd->y_axis_type[curve_cnt] = curve_eAxis_y;
gcd->rows[curve_cnt] = rows;
curve_cnt++;
}
free( tbuf);
free( vbuf);
free( histattrbuf);
}
}
if( curve_cnt == 0 ) {
delete gcd;
*sts = SEV__NODATATIME;
return 0;
}
gcd->cols = curve_cnt;
gcd->get_borders(); gcd->get_borders();
gcd->get_default_axis(); gcd->get_default_axis();
...@@ -363,7 +626,10 @@ void XttSevHist::sevhist_higher_res_cb( void *ctx) ...@@ -363,7 +626,10 @@ void XttSevHist::sevhist_higher_res_cb( void *ctx)
printf( "Low: %s, High: %s\n", s1, s2); printf( "Low: %s, High: %s\n", s1, s2);
} }
sevhist->get_data( &sts, t_low, t_high); if ( sevhist->oid_cnt == 1)
sevhist->get_data( &sts, t_low, t_high);
else
sevhist->get_multidata( &sts, t_low, t_high);
sevhist->time_low_old = 0; sevhist->time_low_old = 0;
sevhist->time_high_old = 0; sevhist->time_high_old = 0;
...@@ -399,7 +665,12 @@ void XttSevHist::sevhist_lower_res_cb( void *ctx) ...@@ -399,7 +665,12 @@ void XttSevHist::sevhist_lower_res_cb( void *ctx)
printf( "Low: %s, High: %s\n", s1, s2); printf( "Low: %s, High: %s\n", s1, s2);
} }
sevhist->get_data( &sts, t_low, t_high);
if ( sevhist->oid_cnt == 1)
sevhist->get_data( &sts, t_low, t_high);
else
sevhist->get_multidata( &sts, t_low, t_high);
sevhist->time_low_old = t_low.tv_sec; sevhist->time_low_old = t_low.tv_sec;
sevhist->time_high_old = t_high.tv_sec; sevhist->time_high_old = t_high.tv_sec;
} }
......
...@@ -66,22 +66,26 @@ class XttSevHist { ...@@ -66,22 +66,26 @@ class XttSevHist {
void (*close_cb)( void *, XttSevHist *); //!< Close callback to parent. void (*close_cb)( void *, XttSevHist *); //!< Close callback to parent.
void (*help_cb)( void *, const char *); //!< Open help window. void (*help_cb)( void *, const char *); //!< Open help window.
bool first_scan; //!< Indicates that this is the first scan. bool first_scan; //!< Indicates that this is the first scan.
char title[250]; //!< Window title char title[250]; //!< Window title
sevcli_tCtx scctx; sevcli_tCtx scctx;
pwr_tOName aname; pwr_tOName anamev[XTT_SEVHIST_MAX];
pwr_tOid oid; pwr_tOName onamev[XTT_SEVHIST_MAX];
pwr_tOid oidv[XTT_SEVHIST_MAX];
int oid_cnt;
CoWow *wow; CoWow *wow;
long int time_low_old; long int time_low_old;
long int time_high_old; long int time_high_old;
bool sevhistobject; //!< Indicates that it is a SevHistObject bool sevhistobjectv[XTT_SEVHIST_MAX]; //!< Indicates that it is a SevHistObject
//! Constructor //! Constructor
XttSevHist( void *xn_parent_ctx, XttSevHist( void *xn_parent_ctx,
const char *xn_name, const char *xn_name,
pwr_tOid* xn_oid, pwr_tOid* xn_oidv,
pwr_tOName *xn_aname, pwr_tOName *xn_aname,
pwr_tOName *xn_oname,
bool *sevhistobjectv,
sevcli_tCtx xn_scctx, sevcli_tCtx xn_scctx,
int *sts, bool sevhistobject); int *sts);
//! Destructor //! Destructor
virtual ~XttSevHist(); virtual ~XttSevHist();
...@@ -90,6 +94,7 @@ class XttSevHist { ...@@ -90,6 +94,7 @@ class XttSevHist {
void pop(); void pop();
int get_data( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to); int get_data( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to);
int get_objectdata( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to); int get_objectdata( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to);
int get_multidata( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to);
static void sevhist_close_cb( void *ctx); static void sevhist_close_cb( void *ctx);
static void sevhist_higher_res_cb( void *ctx); static void sevhist_higher_res_cb( void *ctx);
......
...@@ -227,9 +227,9 @@ XttTrend::XttTrend( void *parent_ctx, ...@@ -227,9 +227,9 @@ XttTrend::XttTrend( void *parent_ctx,
default: default:
element_size[i] = 4; element_size[i] = 4;
} }
gcd->rows[i] = max_points;
} }
gcd->cols = trend_cnt; gcd->cols = trend_cnt;
gcd->rows = max_points;
gcd->x_reverse = 1; gcd->x_reverse = 1;
gcd->get_borders(); gcd->get_borders();
gcd->get_default_axis(); gcd->get_default_axis();
......
...@@ -341,8 +341,9 @@ class XNav { ...@@ -341,8 +341,9 @@ class XNav {
virtual Op *op_new( char *opplace, pwr_tStatus *sts) {return 0;} virtual Op *op_new( char *opplace, pwr_tStatus *sts) {return 0;}
virtual XttTrend *xtttrend_new( char *name, pwr_tAttrRef *objar, pwr_tAttrRef *plotgroup, virtual XttTrend *xtttrend_new( char *name, pwr_tAttrRef *objar, pwr_tAttrRef *plotgroup,
pwr_tStatus *sts) {return 0;} pwr_tStatus *sts) {return 0;}
virtual XttSevHist *xttsevhist_new( char *name, pwr_tOid *oid, pwr_tOName *aname, virtual XttSevHist *xttsevhist_new( char *name, pwr_tOid *oidv, pwr_tOName *aname,
sevcli_tCtx scctx, pwr_tStatus *sts, bool sevhistobject=false) {return 0;} pwr_tOName *oname, bool *sevhistobjectv, sevcli_tCtx scctx,
pwr_tStatus *sts) {return 0;}
virtual XttFast *xttfast_new( char *name, pwr_tAttrRef *objar, pwr_tStatus *sts) {return 0;} virtual XttFast *xttfast_new( char *name, pwr_tAttrRef *objar, pwr_tStatus *sts) {return 0;}
virtual XAttOne *xattone_new( pwr_tAttrRef *objar, char *title, unsigned int priv, virtual XAttOne *xattone_new( pwr_tAttrRef *objar, char *title, unsigned int priv,
pwr_tStatus *sts) {return 0;} pwr_tStatus *sts) {return 0;}
......
...@@ -3109,6 +3109,9 @@ static int xnav_open_func( void *client_data, ...@@ -3109,6 +3109,9 @@ static int xnav_open_func( void *client_data,
char server_node[40]; char server_node[40];
pwr_tOid oidv[11]; pwr_tOid oidv[11];
pwr_tOName anamev[11]; pwr_tOName anamev[11];
pwr_tOName onamev[11];
bool sevhistobjectv[11];
int oid_cnt = 0;
int sts; int sts;
pwr_tAName name_array[10]; pwr_tAName name_array[10];
int i, names; int i, names;
...@@ -3177,22 +3180,100 @@ static int xnav_open_func( void *client_data, ...@@ -3177,22 +3180,100 @@ static int xnav_open_func( void *client_data,
if (EVEN(sts)) return sts; if (EVEN(sts)) return sts;
switch ( classid) { switch ( classid) {
case pwr_cClass_SevHist: case pwr_cClass_SevHist:
break; break;
case pwr_cClass_SevHistObject: case pwr_cClass_SevHistObject:
sevHistObjectFound = true; sevHistObjectFound = true;
break; break;
case pwr_cClass_PlotGroup: case pwr_cClass_PlotGroup:
xnav->message('E', "Not yet implemented"); plotgroup = sevhist_aref;
return XNAV__HOLDCOMMAND; plotgroup_found = 1;
default: break;
xnav->message('E', "Error in object class"); default:
return XNAV__HOLDCOMMAND; xnav->message('E', "Error in object class");
return XNAV__HOLDCOMMAND;
} }
if ( plotgroup_found)
break;
if( sevHistObjectFound ) { if ( plotgroup_found) {
pwr_sClass_PlotGroup plot;
pwr_tCid cid;
int j;
sts = gdh_GetObjectInfo( hist_name, &plot, sizeof(plot));
if ( EVEN(sts)) return sts;
for ( j = 0; j < 20; j++) {
if ( cdh_ObjidIsNull( plot.YObjectName[j].Objid))
break;
sevhist_aref = plot.YObjectName[j];
sts = gdh_GetAttrRefTid( &sevhist_aref, &cid);
if ( EVEN(sts)) return sts;
switch ( cid) {
case pwr_cClass_SevHist: {
sts = gdh_ArefANameToAref( &sevhist_aref, "Attribute", &attr_aref);
if ( EVEN(sts)) return sts;
sts = gdh_GetObjectInfoAttrref( &attr_aref, &aref, sizeof(aref));
if ( EVEN(sts)) return sts;
sts = gdh_AttrrefToName( &aref, aname, sizeof(aname), cdh_mNName);
if ( EVEN(sts)) {
xnav->message('E', "Error in SevHist configuration");
return XNAV__HOLDCOMMAND;
}
s = strchr( aname, '.');
if ( !s) {
xnav->message('E', "Error in SevHist configuration");
return XNAV__HOLDCOMMAND;
}
*s = 0;
strcpy( onamev[oid_cnt], aname);
strcpy( anamev[oid_cnt], s+1);
oidv[oid_cnt] = aref.Objid;
sevhistobjectv[oid_cnt] = false;
oid_cnt++;
break;
}
case pwr_cClass_SevHistObject: {
sts = gdh_ArefANameToAref( &sevhist_aref, "Object", &attr_aref);
if ( EVEN(sts)) return sts;
sts = gdh_GetObjectInfoAttrref( &attr_aref, &aref, sizeof(aref));
if ( EVEN(sts)) return sts;
sts = gdh_AttrrefToName( &aref, aname, sizeof(aname), cdh_mNName);
if ( EVEN(sts)) {
xnav->message('E', "Error in SevHist configuration");
return XNAV__HOLDCOMMAND;
}
s = strchr( aname, '.');
if ( !s) {
//It is a complete object
anamev[oid_cnt][0] = '\0';
}
else {
strcpy( anamev[oid_cnt], s+1);
*s = 0;
}
strcpy( onamev[oid_cnt], aname);
oidv[oid_cnt] = aref.Objid;
sevhistobjectv[oid_cnt] = true;
oid_cnt++;
break;
}
default: ;
}
}
if ( oid_cnt == 0) {
xnav->message('E', "History objects in PlotGroup not found");
return XNAV__SUCCESS;
}
}
else if ( sevHistObjectFound ) {
sts = gdh_ArefANameToAref( &sevhist_aref, "Object", &attr_aref); sts = gdh_ArefANameToAref( &sevhist_aref, "Object", &attr_aref);
if ( EVEN(sts)) return sts; if ( EVEN(sts)) return sts;
...@@ -3207,12 +3288,15 @@ static int xnav_open_func( void *client_data, ...@@ -3207,12 +3288,15 @@ static int xnav_open_func( void *client_data,
s = strchr( aname, '.'); s = strchr( aname, '.');
if ( !s) { if ( !s) {
//It is a complete object //It is a complete object
anamev[i][0] = '\0'; anamev[oid_cnt][0] = '\0';
} }
else { else {
strcpy( anamev[i], s+1); strcpy( anamev[oid_cnt], s+1);
} }
oidv[i] = aref.Objid; oidv[oid_cnt] = aref.Objid;
sevhistobjectv[oid_cnt] = true;
strcpy( onamev[oid_cnt], "");
oid_cnt++;
} }
else { else {
sts = gdh_ArefANameToAref( &sevhist_aref, "Attribute", &attr_aref); sts = gdh_ArefANameToAref( &sevhist_aref, "Attribute", &attr_aref);
...@@ -3232,8 +3316,11 @@ static int xnav_open_func( void *client_data, ...@@ -3232,8 +3316,11 @@ static int xnav_open_func( void *client_data,
return XNAV__HOLDCOMMAND; return XNAV__HOLDCOMMAND;
} }
strcpy( anamev[i], s+1); strcpy( anamev[oid_cnt], s+1);
oidv[i] = aref.Objid; oidv[oid_cnt] = aref.Objid;
sevhistobjectv[oid_cnt] = false;
strcpy( onamev[oid_cnt], "");
oid_cnt++;
} }
// Get server and connect to server // Get server and connect to server
...@@ -3260,7 +3347,7 @@ static int xnav_open_func( void *client_data, ...@@ -3260,7 +3347,7 @@ static int xnav_open_func( void *client_data,
sevcli_set_servernode( &sts, xnav->scctx, server_node); sevcli_set_servernode( &sts, xnav->scctx, server_node);
if ( EVEN(sts)) return sts; if ( EVEN(sts)) return sts;
} }
oidv[i] = pwr_cNOid; oidv[oid_cnt] = pwr_cNOid;
if ( EVEN( dcli_get_qualifier( "/TITLE", title_str, sizeof(title_str)))) { if ( EVEN( dcli_get_qualifier( "/TITLE", title_str, sizeof(title_str)))) {
if ( plotgroup_found) { if ( plotgroup_found) {
...@@ -3277,17 +3364,19 @@ static int xnav_open_func( void *client_data, ...@@ -3277,17 +3364,19 @@ static int xnav_open_func( void *client_data,
} }
if ( plotgroup_found) { if ( plotgroup_found) {
xnav->message('E', "Not yet implemented"); hist = xnav->xttsevhist_new( title_str, oidv, anamev, onamev, sevhistobjectv, xnav->scctx, &sts);
return XNAV__HOLDCOMMAND; if ( ODD(sts)) {
hist->help_cb = xnav_sevhist_help_cb;
}
} }
else if( sevHistObjectFound ) { else if( sevHistObjectFound ) {
hist = xnav->xttsevhist_new( title_str, oidv, anamev, xnav->scctx, &sts, true); hist = xnav->xttsevhist_new( title_str, oidv, anamev, onamev, sevhistobjectv, xnav->scctx, &sts);
if ( ODD(sts)) { if ( ODD(sts)) {
hist->help_cb = xnav_sevhist_help_cb; hist->help_cb = xnav_sevhist_help_cb;
} }
} }
else { else {
hist = xnav->xttsevhist_new( title_str, oidv, anamev, xnav->scctx, &sts); hist = xnav->xttsevhist_new( title_str, oidv, anamev, onamev, sevhistobjectv, xnav->scctx, &sts);
if ( ODD(sts)) { if ( ODD(sts)) {
hist->help_cb = xnav_sevhist_help_cb; hist->help_cb = xnav_sevhist_help_cb;
} }
......
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