Commit 7701b57a authored by Jonas Nylund's avatar Jonas Nylund

SevHistObject added and storage environment revisited

parent fa384bc6
This diff is collapsed.
...@@ -62,7 +62,10 @@ typedef struct { ...@@ -62,7 +62,10 @@ typedef struct {
class sev_server { class sev_server {
public: public:
sev_server() : m_server_status(0), m_item_key(0), m_msg_id(0) {} //TODO should this really be in this file?
static const unsigned int constSevVersion = 2;
sev_server() : m_server_status(0), m_msg_id(0) {}
typedef map<sev_refid, unsigned int>::iterator iterator_refid; typedef map<sev_refid, unsigned int>::iterator iterator_refid;
...@@ -70,7 +73,6 @@ class sev_server { ...@@ -70,7 +73,6 @@ class sev_server {
pwr_tStatus m_server_status; pwr_tStatus m_server_status;
vector<sev_node> m_nodes; vector<sev_node> m_nodes;
map<sev_refid, unsigned int> m_refid; map<sev_refid, unsigned int> m_refid;
tree_sTable *m_item_key;
unsigned int m_msg_id; unsigned int m_msg_id;
sev_db *m_db; sev_db *m_db;
int m_noneth; int m_noneth;
...@@ -82,9 +84,11 @@ class sev_server { ...@@ -82,9 +84,11 @@ class sev_server {
int check_histitems( sev_sMsgHistItems *msg, unsigned int size); int check_histitems( sev_sMsgHistItems *msg, unsigned int size);
int receive_histdata( sev_sMsgHistDataStore *msg, unsigned int size); int receive_histdata( sev_sMsgHistDataStore *msg, unsigned int size);
int send_histdata( qcom_sQid tgt, sev_sMsgHistDataGetRequest *msg, unsigned int size); int send_histdata( qcom_sQid tgt, sev_sMsgHistDataGetRequest *msg, unsigned int size);
int send_objecthistdata( qcom_sQid tgt, sev_sMsgHistDataGetRequest *rmsg, unsigned int size);
int send_itemlist( qcom_sQid tgt); int send_itemlist( qcom_sQid tgt);
int send_server_status( qcom_sQid tgt); int send_server_status( qcom_sQid tgt);
int delete_item( qcom_sQid tgt, sev_sMsgHistItemDelete *rmsg); int delete_item( qcom_sQid tgt, sev_sMsgHistItemDelete *rmsg);
void garbage_collector(); void garbage_collector();
void garbage_item( int idx);
}; };
#endif #endif
...@@ -202,7 +202,7 @@ void XttTblGtk::activate_list_layout( GtkWidget *w, gpointer data) ...@@ -202,7 +202,7 @@ 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) XttSevHist *XttTblGtk::sevhist_new( pwr_tOid oid, char *aname, bool sevhistobject)
{ {
GtkWidget *w; GtkWidget *w;
pwr_tStatus sts; pwr_tStatus sts;
...@@ -214,7 +214,7 @@ XttSevHist *XttTblGtk::sevhist_new( pwr_tOid oid, char *aname) ...@@ -214,7 +214,7 @@ XttSevHist *XttTblGtk::sevhist_new( pwr_tOid oid, char *aname)
strncpy( anamev[0], aname, sizeof(anamev[0])); strncpy( anamev[0], aname, sizeof(anamev[0]));
return new XttSevHistGtk( (void *)this, toplevel, "SevHist", &w, oidv, anamev, return new XttSevHistGtk( (void *)this, toplevel, "SevHist", &w, oidv, anamev,
sevcli, &sts); sevcli, &sts, sevhistobject);
} }
CoLogin *XttTblGtk::login_new( const char *name, CoLogin *XttTblGtk::login_new( const char *name,
......
...@@ -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); XttSevHist *sevhist_new( pwr_tOid oid, char *aname, bool sevhistobject);
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 *),
......
...@@ -120,24 +120,41 @@ void XttTbl::activate_print() ...@@ -120,24 +120,41 @@ void XttTbl::activate_print()
void XttTbl::activate_opensevhist() void XttTbl::activate_opensevhist()
{ {
sevcli_sHistItem *hi; // sevcli_sHistItem *hi;
TblNav_sevhistobject *hi;
if ( !tblnav->get_select( &hi)) { if ( !tblnav->get_select( &hi)) {
message( 'E', "Select an storage item"); message( 'E', "Select an storage item");
return; return;
} }
sevhist_new( hi->oid, hi->attr[0].aname); bool sevhistobject = hi->attrnum > 1;
if( !sevhistobject ) {
sevhist_new( hi->oid, hi->objectattrlist[0].aname, sevhistobject);
}
else {
char *s;
pwr_tAName aname;
s = strchr( hi->oname, '.');
if ( !s) {
//It is a complete object
aname[0] = '\0';
}
else {
strcpy( aname, s+1);
}
sevhist_new( hi->oid, aname, sevhistobject);
}
} }
void XttTbl::delete_item_yes( void *ctx, void *data) void XttTbl::delete_item_yes( void *ctx, void *data)
{ {
XttTbl *tbl = (XttTbl *)ctx; XttTbl *tbl = (XttTbl *)ctx;
sevcli_sHistItem *hi = (sevcli_sHistItem *)data; // sevcli_sHistItem *hi = (sevcli_sHistItem *)data;
TblNav_sevhistobject *hi = (TblNav_sevhistobject *)data;
pwr_tStatus sts; pwr_tStatus sts;
printf("Deleting %s\n", hi->oname); printf("Deleting %s\n", hi->oname);
sevcli_delete_item( &sts, tbl->sevcli, hi->oid, hi->attr[0].aname); sevcli_delete_item( &sts, tbl->sevcli, hi->oid, hi->objectattrlist[0].aname);
if ( EVEN(sts)) { if ( EVEN(sts)) {
tbl->message( 'E', "Delete error"); tbl->message( 'E', "Delete error");
return; return;
...@@ -149,7 +166,8 @@ void XttTbl::delete_item_yes( void *ctx, void *data) ...@@ -149,7 +166,8 @@ 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;
TblNav_sevhistobject *hi;
char msg[300]; char msg[300];
if ( !tblnav->get_select( &hi)) { if ( !tblnav->get_select( &hi)) {
...@@ -157,7 +175,7 @@ void XttTbl::activate_delete_item() ...@@ -157,7 +175,7 @@ void XttTbl::activate_delete_item()
return; return;
} }
sprintf( msg, "Do you really wan't to delete all stored data for item\n\n%s.%s\n", hi->oname, hi->attr[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);
wow->DisplayQuestion( this, "Confirm Delete Item", msg, delete_item_yes, 0, hi); wow->DisplayQuestion( this, "Confirm Delete Item", msg, delete_item_yes, 0, hi);
} }
......
...@@ -55,7 +55,7 @@ class XttTbl { ...@@ -55,7 +55,7 @@ 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) { return 0;} virtual XttSevHist *sevhist_new( pwr_tOid oid, char *aname, bool sevhistobject) { 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 *),
......
...@@ -132,6 +132,7 @@ TblNav::TblNav( ...@@ -132,6 +132,7 @@ TblNav::TblNav(
itemlist(xn_itemlist),item_cnt(xn_item_cnt), itemlist(xn_itemlist),item_cnt(xn_item_cnt),
message_cb(NULL), list_layout(0) message_cb(NULL), list_layout(0)
{ {
create_objectlist(xn_itemlist, xn_item_cnt, status);
*status = 1; *status = 1;
} }
...@@ -438,8 +439,8 @@ int TblNav::create_items() ...@@ -438,8 +439,8 @@ int TblNav::create_items()
brow_SetNodraw( brow->ctx); brow_SetNodraw( brow->ctx);
if ( list_layout) { if ( list_layout) {
for ( i = 0; i < item_cnt; i++) { for ( i = 0; i < (int)sevhistobjectlist.size(); i++) {
new ItemLocal( this, &itemlist[i], NULL, flow_eDest_IntoLast); new ItemLocal( this, &sevhistobjectlist[i], NULL, flow_eDest_IntoLast);
} }
} }
else { else {
...@@ -527,7 +528,7 @@ int TblNav::init_brow_cb( FlowCtx *fctx, void *client_data) ...@@ -527,7 +528,7 @@ int TblNav::init_brow_cb( FlowCtx *fctx, void *client_data)
} }
int TblNav::get_select( sevcli_sHistItem **hi) int TblNav::get_select( TblNav_sevhistobject **hi)
{ {
brow_tNode *node_list; brow_tNode *node_list;
int node_count; int node_count;
...@@ -574,7 +575,7 @@ void TblNav::unzoom() ...@@ -574,7 +575,7 @@ void TblNav::unzoom()
brow_UnZoom( brow->ctx); brow_UnZoom( brow->ctx);
} }
void TblNav::delete_item( sevcli_sHistItem *hi) void TblNav::delete_item( TblNav_sevhistobject *hi)
{ {
brow_tNode *node_list; brow_tNode *node_list;
int node_count; int node_count;
...@@ -587,7 +588,7 @@ void TblNav::delete_item( sevcli_sHistItem *hi) ...@@ -587,7 +588,7 @@ void TblNav::delete_item( sevcli_sHistItem *hi)
continue; continue;
if ( tree[i].item && if ( tree[i].item &&
cdh_ObjidIsEqual( tree[i].item->oid, hi->oid) && cdh_ObjidIsEqual( tree[i].item->oid, hi->oid) &&
strcmp( tree[i].item->attr[0].aname, hi->attr[0].aname) == 0) { strcmp( tree[i].item->objectattrlist[0].aname, hi->objectattrlist[0].aname) == 0) {
tree[i].deleted = 1; tree[i].deleted = 1;
} }
} }
...@@ -603,7 +604,7 @@ void TblNav::delete_item( sevcli_sHistItem *hi) ...@@ -603,7 +604,7 @@ void TblNav::delete_item( sevcli_sHistItem *hi)
case tblnav_eItemType_TreeLocal: { case tblnav_eItemType_TreeLocal: {
ItemLocal *item = (ItemLocal *)baseitem; ItemLocal *item = (ItemLocal *)baseitem;
if ( cdh_ObjidIsEqual( hi->oid, item->item.oid) && if ( cdh_ObjidIsEqual( hi->oid, item->item.oid) &&
strcmp( hi->attr[0].aname, item->item.attr[0].aname) == 0) { strcmp( hi->objectattrlist[0].aname, item->item.objectattrlist[0].aname) == 0) {
brow_DeleteNode( brow->ctx, item->node); brow_DeleteNode( brow->ctx, item->node);
found = 1; found = 1;
} }
...@@ -616,7 +617,7 @@ void TblNav::delete_item( sevcli_sHistItem *hi) ...@@ -616,7 +617,7 @@ void TblNav::delete_item( sevcli_sHistItem *hi)
} }
} }
ItemLocal::ItemLocal( TblNav *tblnav, sevcli_sHistItem *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)
{ {
...@@ -629,8 +630,11 @@ ItemLocal::ItemLocal( TblNav *tblnav, sevcli_sHistItem *xitem, ...@@ -629,8 +630,11 @@ ItemLocal::ItemLocal( TblNav *tblnav, sevcli_sHistItem *xitem,
brow_SetAnnotPixmap( node, 0, tblnav->brow->pixmap_leaf); brow_SetAnnotPixmap( node, 0, tblnav->brow->pixmap_leaf);
strcpy( aname, item.oname); strcpy( aname, item.oname);
if( item.attrnum == 1 ) {
strcat( aname, "."); strcat( aname, ".");
strcat( aname, item.attr[0].aname); strcat( aname, item.objectattrlist[0].aname);
}
printf("aname %s\n", aname);
brow_SetAnnotation( node, 0, aname, strlen(aname)); brow_SetAnnotation( node, 0, aname, strlen(aname));
brow_SetAnnotation( node, 1, item.description, strlen(item.description)); brow_SetAnnotation( node, 1, item.description, strlen(item.description));
} }
...@@ -691,11 +695,11 @@ int ItemLocal::open_attributes( TblNav *tblnav, double x, double y) ...@@ -691,11 +695,11 @@ int ItemLocal::open_attributes( TblNav *tblnav, double x, double y)
sprintf( value, "%f", item.deadband); sprintf( value, "%f", item.deadband);
new ItemLocalAttr( tblnav, "Deadband", value, node, flow_eDest_IntoLast); new ItemLocalAttr( tblnav, "Deadband", value, node, flow_eDest_IntoLast);
for ( int i = 0; i < 1; i++) { for ( int i = 0; i < (int)item.objectattrlist.size(); i++) {
sprintf( txt, "Attr[%d].Name", i); sprintf( txt, "Attr[%d].Name", i);
new ItemLocalAttr( tblnav, txt, item.attr[0].aname, node, flow_eDest_IntoLast); new ItemLocalAttr( tblnav, txt, item.objectattrlist[i].aname, node, flow_eDest_IntoLast);
switch ( item.attr[0].type) { switch ( item.objectattrlist[i].type) {
case pwr_eType_Int64: strcpy( value, "Int64"); break; case pwr_eType_Int64: strcpy( value, "Int64"); break;
case pwr_eType_Int32: strcpy( value, "Int32"); break; case pwr_eType_Int32: strcpy( value, "Int32"); break;
case pwr_eType_Int16: strcpy( value, "Int16"); break; case pwr_eType_Int16: strcpy( value, "Int16"); break;
...@@ -717,11 +721,11 @@ int ItemLocal::open_attributes( TblNav *tblnav, double x, double y) ...@@ -717,11 +721,11 @@ int ItemLocal::open_attributes( TblNav *tblnav, double x, double y)
new ItemLocalAttr( tblnav, txt, value, node, flow_eDest_IntoLast); new ItemLocalAttr( tblnav, txt, value, node, flow_eDest_IntoLast);
sprintf( txt, "Attr[%d].DataSize", i); sprintf( txt, "Attr[%d].DataSize", i);
sprintf( value, "%d", item.attr[0].size); sprintf( value, "%d", item.objectattrlist[i].size);
new ItemLocalAttr( tblnav, txt, value, node, flow_eDest_IntoLast); new ItemLocalAttr( tblnav, txt, value, node, flow_eDest_IntoLast);
sprintf( txt, "Attr[%d].Unit", i); sprintf( txt, "Attr[%d].Unit", i);
new ItemLocalAttr( tblnav, txt, item.attr[0].unit, node, flow_eDest_IntoLast); new ItemLocalAttr( tblnav, txt, item.objectattrlist[i].unit, node, flow_eDest_IntoLast);
} }
brow_SetOpen( node, tblnav_mOpen_Attributes); brow_SetOpen( node, tblnav_mOpen_Attributes);
brow_ResetNodraw( tblnav->brow->ctx); brow_ResetNodraw( tblnav->brow->ctx);
...@@ -761,7 +765,7 @@ ItemLocalAttr::ItemLocalAttr( TblNav *tblnav, const char *name, char *value, ...@@ -761,7 +765,7 @@ ItemLocalAttr::ItemLocalAttr( TblNav *tblnav, const char *name, char *value,
brow_SetAnnotation( node, 1, value, strlen(value)); brow_SetAnnotation( node, 1, value, strlen(value));
} }
ItemTreeLocal::ItemTreeLocal( TblNav *tblnav, sevcli_sHistItem *xitem, int index, ItemTreeLocal::ItemTreeLocal( TblNav *tblnav, TblNav_sevhistobject *xitem, int index,
brow_tNode dest, flow_eDest dest_code) : brow_tNode dest, flow_eDest dest_code) :
ItemLocal(tblnav, xitem, dest, dest_code), idx(index) ItemLocal(tblnav, xitem, dest, dest_code), idx(index)
{ {
...@@ -774,8 +778,10 @@ ItemTreeLocal::ItemTreeLocal( TblNav *tblnav, sevcli_sHistItem *xitem, int index ...@@ -774,8 +778,10 @@ ItemTreeLocal::ItemTreeLocal( TblNav *tblnav, sevcli_sHistItem *xitem, int index
strcpy( aname, s+1); strcpy( aname, s+1);
else else
strcpy( aname, item.oname); strcpy( aname, item.oname);
if( item.attrnum == 1 ) {
strcat( aname, "."); strcat( aname, ".");
strcat( aname, item.attr[0].aname); strcat( aname, item.objectattrlist[0].aname);
}
brow_SetAnnotation( node, 0, aname, strlen(aname)); brow_SetAnnotation( node, 0, aname, strlen(aname));
} }
...@@ -851,12 +857,12 @@ void TblNav::build_tree() ...@@ -851,12 +857,12 @@ void TblNav::build_tree()
pwr_tAName aname; pwr_tAName aname;
int seg; int seg;
for ( int i = 0; i < item_cnt; i++) { for ( int i = 0; i < (int)sevhistobjectlist.size(); i++) {
TblTreeNode n; TblTreeNode n;
strcpy( aname, itemlist[i].oname); strcpy( aname, sevhistobjectlist[i].oname);
strcat( aname, "."); strcat( aname, ".");
strcat( aname, itemlist[i].attr[0].aname); strcat( aname, sevhistobjectlist[i].objectattrlist[0].aname);
seg = dcli_parse( aname, "-", "", seg = dcli_parse( aname, "-", "",
(char *) name_array, sizeof( name_array)/sizeof( name_array[0]), (char *) name_array, sizeof( name_array)/sizeof( name_array[0]),
...@@ -875,7 +881,7 @@ void TblNav::build_tree() ...@@ -875,7 +881,7 @@ void TblNav::build_tree()
tree[j].fch = j + 1; tree[j].fch = j + 1;
strcpy( n.sname, name_array[j]); strcpy( n.sname, name_array[j]);
if ( j == seg -1) if ( j == seg -1)
n.item = &itemlist[i]; n.item = &sevhistobjectlist[i];
tree.push_back(n); tree.push_back(n);
} }
} }
...@@ -899,7 +905,7 @@ void TblNav::build_tree() ...@@ -899,7 +905,7 @@ void TblNav::build_tree()
n.bws = last; n.bws = last;
tree[last].fws = tree.size(); tree[last].fws = tree.size();
if ( j == seg - 1) if ( j == seg - 1)
n.item = &itemlist[i]; n.item = &sevhistobjectlist[i];
tree.push_back(n); tree.push_back(n);
for ( int k = j + 1; k < seg; k++) { for ( int k = j + 1; k < seg; k++) {
...@@ -910,7 +916,7 @@ void TblNav::build_tree() ...@@ -910,7 +916,7 @@ void TblNav::build_tree()
tree[n.fth].fch = tree.size(); tree[n.fth].fch = tree.size();
strcpy( n.sname, name_array[k]); strcpy( n.sname, name_array[k]);
if ( k == seg - 1) if ( k == seg - 1)
n.item = &itemlist[i]; n.item = &sevhistobjectlist[i];
tree.push_back(n); tree.push_back(n);
} }
break; break;
...@@ -922,7 +928,7 @@ void TblNav::build_tree() ...@@ -922,7 +928,7 @@ void TblNav::build_tree()
n.bws = last; n.bws = last;
tree[last].fws = tree.size(); tree[last].fws = tree.size();
if ( j == seg - 1) if ( j == seg - 1)
n.item = &itemlist[i]; n.item = &sevhistobjectlist[i];
tree.push_back(n); tree.push_back(n);
for ( int k = j + 1; k < seg; k++) { for ( int k = j + 1; k < seg; k++) {
TblTreeNode n; TblTreeNode n;
...@@ -932,7 +938,7 @@ void TblNav::build_tree() ...@@ -932,7 +938,7 @@ void TblNav::build_tree()
tree[n.fth].fch = tree.size(); tree[n.fth].fch = tree.size();
strcpy( n.sname, name_array[k]); strcpy( n.sname, name_array[k]);
if ( k == seg - 1) if ( k == seg - 1)
n.item = &itemlist[i]; n.item = &sevhistobjectlist[i];
tree.push_back(n); tree.push_back(n);
} }
break; break;
...@@ -943,3 +949,36 @@ void TblNav::build_tree() ...@@ -943,3 +949,36 @@ void TblNav::build_tree()
} }
} }
} }
void TblNav::create_objectlist( sevcli_sHistItem *xn_itemlist,
int xn_item_cnt,
pwr_tStatus *status)
{
sevcli_sHistItem *histItemPtr = xn_itemlist;
while ( (int)sevhistobjectlist.size() < xn_item_cnt ) {
//Item with multiple attributes
TblNav_sevhistobject object;
object.attrnum = histItemPtr->attrnum;
object.creatime = histItemPtr->creatime;
object.deadband = histItemPtr->deadband;
strncpy(object.description, histItemPtr->description, sizeof(object.description));
object.modtime = histItemPtr->modtime;
object.oid = histItemPtr->oid;
strncpy(object.oname, histItemPtr->oname, sizeof(histItemPtr->oname));
object.options = histItemPtr->options;
object.scantime = histItemPtr->scantime;
object.storagetime = histItemPtr->storagetime;
size_t j=0;
for ( j=0; j < object.attrnum; j++ ) {
TblNav_sevhistobjectattr oattr;
strncpy(oattr.aname, histItemPtr->attr[j].aname, sizeof(oattr.aname));
oattr.elem = histItemPtr->attr[j].elem;
oattr.size = histItemPtr->attr[j].size;
oattr.type = histItemPtr->attr[j].type;
strncpy(oattr.unit, histItemPtr->attr[j].unit, sizeof(oattr.unit));
object.objectattrlist.push_back(oattr);
}
sevhistobjectlist.push_back(object);
histItemPtr = (sevcli_sHistItem *)&histItemPtr->attr[j];
}
}
...@@ -63,6 +63,30 @@ typedef enum { ...@@ -63,6 +63,30 @@ typedef enum {
tblnav_mOpen_Attributes = 1 << 1 tblnav_mOpen_Attributes = 1 << 1
} tblnav_mOpen; } tblnav_mOpen;
class TblNav_sevhistobjectattr {
public:
pwr_tAName aname;
pwr_eType type;
unsigned int size;
unsigned int elem;
pwr_tString16 unit;
};
class TblNav_sevhistobject {
public:
pwr_tOid oid;
pwr_tAName oname;
pwr_tDeltaTime storagetime;
pwr_tTime creatime;
pwr_tTime modtime;
pwr_tString80 description;
pwr_tFloat32 scantime;
pwr_tFloat32 deadband;
pwr_tMask options;
unsigned int attrnum;
vector<TblNav_sevhistobjectattr> objectattrlist;
};
class TblTreeNode { class TblTreeNode {
public: public:
...@@ -73,7 +97,7 @@ public: ...@@ -73,7 +97,7 @@ public:
int fws; int fws;
int bws; int bws;
char sname[80]; char sname[80];
sevcli_sHistItem *item; TblNav_sevhistobject *item;
int deleted; int deleted;
}; };
...@@ -100,6 +124,7 @@ class TblNavBrow { ...@@ -100,6 +124,7 @@ class TblNavBrow {
}; };
//! The navigation area of the attribute editor. //! The navigation area of the attribute editor.
class TblNav { class TblNav {
public: public:
...@@ -112,6 +137,7 @@ class TblNav { ...@@ -112,6 +137,7 @@ class TblNav {
void *parent_ctx; void *parent_ctx;
TblNavBrow *brow; TblNavBrow *brow;
sevcli_sHistItem *itemlist; sevcli_sHistItem *itemlist;
vector<TblNav_sevhistobject> sevhistobjectlist;
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);
...@@ -122,14 +148,16 @@ class TblNav { ...@@ -122,14 +148,16 @@ 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( sevcli_sHistItem **hi); int get_select( 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();
void show_tree(); void show_tree();
void show_list(); void show_list();
void delete_item( sevcli_sHistItem *hi); void delete_item( TblNav_sevhistobject *hi);
void create_objectlist( sevcli_sHistItem *xn_itemlist,
int xn_item_cnt,
pwr_tStatus *status);
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);
...@@ -146,10 +174,13 @@ class ItemBase { ...@@ -146,10 +174,13 @@ class ItemBase {
//! Item for a normal attribute. //! Item for a normal attribute.
class ItemLocal : public ItemBase { class ItemLocal : public ItemBase {
public: public:
ItemLocal( TblNav *tblnav, sevcli_sHistItem *item, brow_tNode dest, flow_eDest dest_code); // ItemLocal( TblNav *tblnav, sevcli_sHistItem *item, brow_tNode dest, flow_eDest dest_code);
ItemLocal( TblNav *tblnav, TblNav_sevhistobject *item, brow_tNode dest, flow_eDest dest_code);
virtual ~ItemLocal() {} virtual ~ItemLocal() {}
sevcli_sHistItem item; // sevcli_sHistItem item;
TblNav_sevhistobject item;
brow_tNode node; brow_tNode node;
int open_attributes( TblNav *tblnav, double x, double y); int open_attributes( TblNav *tblnav, double x, double y);
...@@ -161,14 +192,15 @@ class ItemLocalAttr : public ItemBase { ...@@ -161,14 +192,15 @@ class ItemLocalAttr : public ItemBase {
ItemLocalAttr( TblNav *tblnav, const char *iname, char *ivalue, brow_tNode dest, flow_eDest dest_code); ItemLocalAttr( TblNav *tblnav, const char *iname, char *ivalue, brow_tNode dest, flow_eDest dest_code);
virtual ~ItemLocalAttr() {} virtual ~ItemLocalAttr() {}
sevcli_sHistItem item; TblNav_sevhistobject item;
//sevcli_sHistItem item;
brow_tNode node; brow_tNode node;
}; };
//! Item for a normal attribute. //! Item for a normal attribute.
class ItemTreeLocal : public ItemLocal { class ItemTreeLocal : public ItemLocal {
public: public:
ItemTreeLocal( TblNav *tblnav, sevcli_sHistItem *item, int index, brow_tNode dest, flow_eDest dest_code); ItemTreeLocal( TblNav *tblnav, TblNav_sevhistobject *item, int index, brow_tNode dest, flow_eDest dest_code);
virtual ~ItemTreeLocal() {} virtual ~ItemTreeLocal() {}
int idx; int idx;
......
...@@ -38,9 +38,9 @@ class sev_attr { ...@@ -38,9 +38,9 @@ class sev_attr {
class sev_item { class sev_item {
public: public:
sev_item() : deadband_active(0), last_id(0), first_storage(1), status(0), logged_status(0), sev_item() : deadband_active(0), last_id(0), value_size(0), old_value(0), first_storage(1), status(0), logged_status(0),
deleted(0) deleted(0)
{ memset( old_value, 0, sizeof(old_value));} { /*memset( old_value, 0, sizeof(old_value));*/}
unsigned int id; unsigned int id;
char tablename[256]; char tablename[256];
pwr_tOid oid; pwr_tOid oid;
...@@ -55,10 +55,12 @@ class sev_item { ...@@ -55,10 +55,12 @@ class sev_item {
pwr_tMask options; pwr_tMask options;
int deadband_active; int deadband_active;
unsigned int last_id; unsigned int last_id;
char old_value[8]; //char old_value[8];
unsigned int value_size;
void *old_value;
int first_storage; int first_storage;
unsigned int attrnum; unsigned int attrnum;
sev_attr attr[1]; vector<sev_attr> attr;
pwr_tStatus status; pwr_tStatus status;
pwr_tStatus logged_status; pwr_tStatus logged_status;
int deleted; int deleted;
...@@ -92,5 +94,31 @@ class sev_db { ...@@ -92,5 +94,31 @@ class sev_db {
virtual int get_items( pwr_tStatus *sts) { return 0;} virtual int get_items( pwr_tStatus *sts) { return 0;}
virtual int delete_old_data( pwr_tStatus *sts, pwr_tOid oid, char *aname, virtual int delete_old_data( pwr_tStatus *sts, pwr_tOid oid, char *aname,
pwr_tMask options, pwr_tTime limit) { return 0;} pwr_tMask options, pwr_tTime limit) { return 0;}
virtual char *oid_to_table( pwr_tOid oid, char *aname) { return 0;}
virtual int check_objectitem( pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *oname, char *aname,
pwr_tDeltaTime storagetime,
char *description, pwr_tFloat32 scantime,
pwr_tFloat32 deadband, pwr_tMask options, unsigned int *idx) { return 0;}
virtual int add_objectitem( pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *oname, char *aname,
pwr_tDeltaTime storagetime,
char *description, pwr_tFloat32 scantime,
pwr_tFloat32 deadband, pwr_tMask options, unsigned int *idx) { return 0;}
virtual int store_objectitem( pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *oname, char *aname,
pwr_tDeltaTime storagetime, char *description, pwr_tFloat32 scantime, pwr_tFloat32 deadband, pwr_tMask options) { return 0;}
virtual int add_objectitemattr( pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *aname, char *oname,
pwr_eType type, unsigned int size, unsigned int *idx) { return 0;}
virtual int get_item( pwr_tStatus *sts, sev_item *item, char *tablename) { return 0;}
virtual int get_objectitem( pwr_tStatus *sts, sev_item *item, char *tablename) { return 0;}
virtual int get_objectitems( pwr_tStatus *sts) { return 0;}
virtual int check_objectitemattr( pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *aname, char *oname,
pwr_eType type, unsigned int size, unsigned int *idx) { return 0;}
virtual int delete_old_objectdata( pwr_tStatus *sts, char *tablename,
pwr_tMask options, pwr_tTime limit) { return 0;}
virtual int get_objectvalues( pwr_tStatus *sts, sev_item *item,
unsigned int size, pwr_tTime *starttime, pwr_tTime *endtime,
int maxsize, pwr_tTime **tbuf, void **vbuf, unsigned int *bsize) { return 0;}
}; };
#endif #endif
This diff is collapsed.
...@@ -67,6 +67,8 @@ class sev_dbms_env ...@@ -67,6 +67,8 @@ class sev_dbms_env
int open(const char *host, const char *user, const char *passwd, int open(const char *host, const char *user, const char *passwd,
const char *dbName, unsigned int port, const char *socket); const char *dbName, unsigned int port, const char *socket);
int checkAndUpdateVersion(unsigned int version);
int updateDB_to_SevVersion2(void);
MYSQL *createDb(void); MYSQL *createDb(void);
MYSQL *openDb(void); MYSQL *openDb(void);
bool exists() { return m_exists;} bool exists() { return m_exists;}
...@@ -104,7 +106,7 @@ class sev_dbms : public sev_db { ...@@ -104,7 +106,7 @@ class sev_dbms : public sev_db {
sev_dbms_env *m_env; sev_dbms_env *m_env;
sev_dbms( sev_dbms_env *env) : m_env(env) {} sev_dbms( sev_dbms_env *env) : m_env(env) {}
~sev_dbms() {} ~sev_dbms();
int check_item( pwr_tStatus *sts, pwr_tOid oid, char *oname, char *aname, int check_item( pwr_tStatus *sts, pwr_tOid oid, char *oname, char *aname,
pwr_tDeltaTime storagetime, pwr_eType type, unsigned int size, pwr_tDeltaTime storagetime, pwr_eType type, unsigned int size,
...@@ -136,7 +138,40 @@ class sev_dbms : public sev_db { ...@@ -136,7 +138,40 @@ class sev_dbms : public sev_db {
char *oid_to_table( pwr_tOid oid, char *aname); char *oid_to_table( pwr_tOid oid, char *aname);
char *pwrtype_to_type( pwr_eType type, unsigned int size); char *pwrtype_to_type( pwr_eType type, unsigned int size);
static int timestr_to_time( char *tstr, pwr_tTime *ts); static int timestr_to_time( char *tstr, pwr_tTime *ts);
int check_objectitem( pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *oname, char *aname,
pwr_tDeltaTime storagetime,
char *description, pwr_tFloat32 scantime,
pwr_tFloat32 deadband, pwr_tMask options, unsigned int *idx);
int add_objectitem( pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *oname, char *aname,
pwr_tDeltaTime storagetime,
char *description, pwr_tFloat32 scantime,
pwr_tFloat32 deadband, pwr_tMask options, unsigned int *idx);
int store_objectitem( pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *oname, char *aname,
pwr_tDeltaTime storagetime, char *description, pwr_tFloat32 scantime,
pwr_tFloat32 deadband, pwr_tMask options);
int create_objecttable( pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *aname,
pwr_tMask options, float deadband);
int add_objectitemattr( pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *aname, char *oname,
pwr_eType type, unsigned int size, unsigned int *idx);
int store_objectvalue( pwr_tStatus *sts, int item_idx, int attr_idx,
pwr_tTime time, void *buf, void *oldbuf, unsigned int size);
int get_item( pwr_tStatus *sts, sev_item *item, char *tablename);
int get_objectitem( pwr_tStatus *sts, sev_item *item, char *tablename);
int get_objectitems( pwr_tStatus *sts);
int get_objectitemattributes( pwr_tStatus *sts, sev_item *item, char *tablename);
int check_objectitemattr( pwr_tStatus *sts, char *tablename, pwr_tOid oid, char *aname, char *oname,
pwr_eType type, unsigned int size, unsigned int *idx);
int get_nextattridx( pwr_tStatus *sts, char *tablename );
int delete_old_objectdata( pwr_tStatus *sts, char *tablename,
pwr_tMask options, pwr_tTime limit);
int alter_attrcolumn(pwr_tStatus *sts, char *tablename, char *aname, pwr_eType newtype, unsigned int newsize, pwr_eType oldtype, unsigned int oldsize);
int rename_attrcolumn(pwr_tStatus *sts, char *tablename, char *aname, pwr_eType type, unsigned int size);
int remove_objectitemattr( pwr_tStatus *sts, char *tablename, char *aname);
int update_objectitemattr( pwr_tStatus *sts, char *tablename, char *aname, pwr_eType type, unsigned int size);
int check_deadband(pwr_eType type, unsigned int size, pwr_tFloat32 deadband, void *value, void *oldvalue);
int get_objectvalues( pwr_tStatus *sts, sev_item *item, unsigned int size, pwr_tTime *starttime, pwr_tTime *endtime,
int maxsize, pwr_tTime **tbuf, void **vbuf, unsigned int *bsize);
pwr_tUInt64 get_minFromIntegerColumn( char *tablename, char *colname );
}; };
#endif #endif
#endif #endif
This diff is collapsed.
...@@ -42,6 +42,32 @@ class sev_sevhist { ...@@ -42,6 +42,32 @@ class sev_sevhist {
pwr_tFloat32 scantime; pwr_tFloat32 scantime;
}; };
class sev_sevhistobjectattr {
public:
pwr_tAttrRef aref;
pwr_tString80 description;
pwr_tString16 unit;
pwr_tAName aname;
pwr_tRefId refid;
void *datap;
pwr_eType type;
unsigned int size;
};
class sev_sevhistobject {
public:
pwr_tAttrRef aref;
pwr_tAName aname;
pwr_tDeltaTime storagetime;
pwr_tFloat32 deadband;
pwr_tMask options;
pwr_tRefId sevid;
pwr_tString80 description;
pwr_tFloat32 scantime;
unsigned int datasize;
vector<sev_sevhistobjectattr> sevhistobjectattrlist;
};
class sev_sevhistthread { class sev_sevhistthread {
public: public:
sev_sevhistthread() : configerror(0) {} sev_sevhistthread() : configerror(0) {}
...@@ -54,6 +80,7 @@ class sev_sevhistthread { ...@@ -54,6 +80,7 @@ class sev_sevhistthread {
pwr_tRefId refid; pwr_tRefId refid;
int configerror; int configerror;
vector<sev_sevhist> sevhistlist; vector<sev_sevhist> sevhistlist;
vector<sev_sevhistobject> sevhistobjectlist;
}; };
class sev_node { class sev_node {
...@@ -88,6 +115,16 @@ class rt_sevhistmon { ...@@ -88,6 +115,16 @@ class rt_sevhistmon {
int init(); int init();
int init_objects(); int init_objects();
int init_sevhistobjects();
void insert_sevhistobjectattr(pwr_sAttrRef *aref,
pwr_tAName objectname,
int hs_idx,
vector<sev_sevhistobjectattr> *listP);
int get_sevhistobjectattributes (pwr_tAName objectname,
vector<sev_sevhistobjectattr> *listP,
int hs_idx,
pwr_tBoolean first);
bool correct_histtype(const pwr_eType type);
int close(); int close();
int close_objects(); int close_objects();
int mainloop(); int mainloop();
......
...@@ -42,7 +42,9 @@ typedef enum { ...@@ -42,7 +42,9 @@ typedef enum {
sev_eMsgType_HistItemDelete, sev_eMsgType_HistItemDelete,
sev_eMsgType_HistItemStatus, sev_eMsgType_HistItemStatus,
sev_eMsgType_ServerStatusRequest, sev_eMsgType_ServerStatusRequest,
sev_eMsgType_ServerStatus sev_eMsgType_ServerStatus,
sev_eMsgType_HistObjectDataGetRequest,
sev_eMsgType_HistObjectDataGet
} sev_eMsgType; } sev_eMsgType;
typedef struct { typedef struct {
...@@ -84,6 +86,8 @@ typedef struct { ...@@ -84,6 +86,8 @@ typedef struct {
typedef struct { typedef struct {
sev_eMsgType Type; sev_eMsgType Type;
pwr_tStatus Status; pwr_tStatus Status;
unsigned int NumItems;
unsigned int NumAttributes;
sev_sHistItem Items[1]; sev_sHistItem Items[1];
} sev_sMsgHistItems; } sev_sMsgHistItems;
...@@ -113,6 +117,18 @@ typedef struct { ...@@ -113,6 +117,18 @@ typedef struct {
int Data[1]; int Data[1];
} sev_sMsgHistDataGet; } sev_sMsgHistDataGet;
typedef struct {
sev_eMsgType Type;
pwr_tOid Oid;
pwr_tOName AName;
pwr_tStatus Status;
int NumPoints;
int NumAttributes;
unsigned int TotalDataSize;
sev_sHistAttr Attr[1];
int Data[1];
} sev_sMsgHistObjectDataGet;
typedef struct { typedef struct {
sev_eMsgType Type; sev_eMsgType Type;
pwr_tOid Oid; pwr_tOid Oid;
......
...@@ -115,6 +115,104 @@ int sevcli_get_itemlist( pwr_tStatus *sts, sevcli_tCtx ctx, sevcli_sHistItem **l ...@@ -115,6 +115,104 @@ int sevcli_get_itemlist( pwr_tStatus *sts, sevcli_tCtx ctx, sevcli_sHistItem **l
tgt.qix = sev_eProcSevServer; tgt.qix = sev_eProcSevServer;
put.reply = ctx->qid;
put.type.b = (qcom_eBtype) sev_cMsgClass;
put.type.s = (qcom_eStype) sev_eMsgType_HistItemsRequest;
put.msg_id = ctx->msg_id++;
put.size = sizeof(*msg);
msg = (sev_sMsgAny *) qcom_Alloc( sts, put.size);
put.data = msg;
msg->Type = sev_eMsgType_HistItemsRequest;
if ( !qcom_Put( sts, &tgt, &put)) {
qcom_Free( &lsts, put.data);
return 0;
}
sev_sMsgHistItems *rmsg;
memset( &get, 0, sizeof(get));
for (;;) {
rmsg = (sev_sMsgHistItems *) qcom_Get( sts, &ctx->qid, &get, tmo);
if ( *sts == QCOM__TMO || !rmsg) {
return 0;
}
if ( get.type.b == sev_cMsgClass &&
get.type.s == (qcom_eStype) sev_eMsgType_HistItems)
break;
qcom_Free( sts, rmsg);
}
*sts = rmsg->Status;
if ( EVEN(*sts))
return 0;
//int item_cnt = (get.size - sizeof(sev_sMsgHistItems)) / sizeof(sev_sHistItem) + 1;
int item_cnt = rmsg->NumItems;
int attr_cnt = rmsg->NumAttributes;
unsigned int data_size = (item_cnt * sizeof(sevcli_sHistItem)) + ((attr_cnt - item_cnt) * sizeof(sevcli_sHistAttr));
printf("Get size: %d, data size: %d\n", get.size, data_size);
lp = (sevcli_sHistItem *) malloc( data_size );
sevcli_sHistItem *lp2 = lp;
sev_sHistItem *itemPtr = ((sev_sMsgHistItems *)rmsg)->Items;
for ( i = 0; i < item_cnt; i++) {
printf("i : %d\n", i);
lp->oid = itemPtr->oid;
strncpy( lp->oname, itemPtr->oname, sizeof(lp->oname));
lp->storagetime = net_NetTimeToDeltaTime( &itemPtr->storagetime);
lp->deadband = itemPtr->deadband;
lp->options = itemPtr->options;
lp->creatime = net_NetTimeToTime( &itemPtr->creatime);
lp->modtime = net_NetTimeToTime( &itemPtr->modtime);
strncpy( lp->description, itemPtr->description, sizeof(lp->description));
lp->scantime = itemPtr->scantime;
lp->attrnum = itemPtr->attrnum;
size_t j=0;
for( j=0; j < lp->attrnum; j++ ) {
lp->attr[j].type = itemPtr->attr[j].type;
lp->attr[j].size = itemPtr->attr[j].size;
strncpy( lp->attr[j].aname, itemPtr->attr[j].aname, sizeof(lp->attr[0].aname));
strncpy( lp->attr[j].unit, itemPtr->attr[j].unit, sizeof(lp->attr[0].unit));
}
itemPtr = (sev_sHistItem *)&itemPtr->attr[j];
lp = (sevcli_sHistItem *)&lp->attr[j];
}
qcom_Free( sts, rmsg);
*cnt = item_cnt;
*list = lp2;
*sts = SEV__SUCCESS;
return 1;
}
/*
int sevcli_get_itemlist( pwr_tStatus *sts, sevcli_tCtx ctx, sevcli_sHistItem **list,
unsigned int *cnt)
{
sev_sMsgAny *msg;
qcom_sQid tgt;
qcom_sPut put;
pwr_tStatus lsts;
int tmo = 1000;
qcom_sGet get;
sevcli_sHistItem *lp;
int i;
if ( ctx->server)
tgt.nid = ctx->server;
else
tgt.nid = ctx->qid.nid;
tgt.qix = sev_eProcSevServer;
put.reply = ctx->qid; put.reply = ctx->qid;
put.type.b = (qcom_eBtype) sev_cMsgClass; put.type.b = (qcom_eBtype) sev_cMsgClass;
put.type.s = (qcom_eStype) sev_eMsgType_HistItemsRequest; put.type.s = (qcom_eStype) sev_eMsgType_HistItemsRequest;
...@@ -180,6 +278,7 @@ int sevcli_get_itemlist( pwr_tStatus *sts, sevcli_tCtx ctx, sevcli_sHistItem **l ...@@ -180,6 +278,7 @@ int sevcli_get_itemlist( pwr_tStatus *sts, sevcli_tCtx ctx, sevcli_sHistItem **l
*sts = SEV__SUCCESS; *sts = SEV__SUCCESS;
return 1; return 1;
} }
*/
int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid,
char *aname, pwr_tTime starttime, pwr_tTime endtime, int numpoints, char *aname, pwr_tTime starttime, pwr_tTime endtime, int numpoints,
...@@ -220,6 +319,7 @@ int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, ...@@ -220,6 +319,7 @@ int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid,
// Empty queue // Empty queue
sev_sMsgHistDataGet *rmsg; sev_sMsgHistDataGet *rmsg;
memset( &get, 0, sizeof(get));
for (;;) { for (;;) {
rmsg = (sev_sMsgHistDataGet *) qcom_Get(sts, &ctx->qid, &get, 0); rmsg = (sev_sMsgHistDataGet *) qcom_Get(sts, &ctx->qid, &get, 0);
if ( !rmsg) if ( !rmsg)
...@@ -268,6 +368,116 @@ int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, ...@@ -268,6 +368,116 @@ int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid,
return 1; return 1;
} }
int sevcli_get_objectitemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, char *aname,
pwr_tTime starttime, pwr_tTime endtime, int numpoints,
pwr_tTime **tbuf, void **vbuf, int *rows,
sevcli_sHistAttr **histattr, int *numattributes)
{
sev_sMsgHistDataGetRequest *msg;
qcom_sQid tgt;
qcom_sPut put;
int tmo = 30000;
qcom_sGet get;
pwr_tStatus lsts;
if ( ctx->server)
tgt.nid = ctx->server;
else
tgt.nid = ctx->qid.nid;
tgt.qix = sev_eProcSevServer;
put.reply = ctx->qid;
put.type.b = (qcom_eBtype) sev_cMsgClass;
put.type.s = (qcom_eStype) sev_eMsgType_HistObjectDataGetRequest;
put.msg_id = ctx->msg_id++;
put.size = sizeof(*msg);
msg = (sev_sMsgHistDataGetRequest *) qcom_Alloc( sts, put.size);
put.data = msg;
msg->Type = sev_eMsgType_HistObjectDataGetRequest;
msg->Oid = oid;
strncpy( msg->AName, aname, sizeof(msg->AName));
msg->StartTime = net_TimeToNetTime( &starttime);
msg->EndTime = net_TimeToNetTime( &endtime);
msg->NumPoints = numpoints;
// Empty queue
sev_sMsgHistObjectDataGet *rmsg;
memset(&get, 0, sizeof(get));
for (;;) {
rmsg = (sev_sMsgHistObjectDataGet *) qcom_Get(sts, &ctx->qid, &get, 0);
if ( !rmsg)
break;
}
if ( !qcom_Put( sts, &tgt, &put)) {
qcom_Free( &lsts, put.data);
*sts = 0;
return 0;
}
memset( &get, 0, sizeof(get));
for (;;) {
rmsg = (sev_sMsgHistObjectDataGet *) qcom_Get(sts, &ctx->qid, &get, tmo);
if ( *sts == QCOM__TMO || !rmsg) {
*sts = 0;
return 0;
}
if ( get.type.b == sev_cMsgClass &&
get.type.s == (qcom_eStype) sev_eMsgType_HistObjectDataGet &&
cdh_ObjidIsEqual( oid, rmsg->Oid) &&
cdh_NoCaseStrcmp( aname, rmsg->AName) == 0)
break;
qcom_Free( sts, rmsg);
}
*sts = rmsg->Status;
if ( EVEN(*sts))
return 0;
if( rmsg->NumPoints == 0 ) {
*sts = 0;
return 0;
}
*numattributes = rmsg->NumAttributes;
int item_cnt = rmsg->NumPoints;
unsigned int timebufsize = item_cnt * sizeof(pwr_tTime);
unsigned int databufsize = rmsg->TotalDataSize - timebufsize;
*tbuf = malloc( timebufsize);
*vbuf = malloc( databufsize );
sevcli_sHistAttr *attrptr;
attrptr = calloc( rmsg->NumAttributes, sizeof(sevcli_sHistAttr) );
int attrCount = rmsg->NumAttributes;
void *ptr = &rmsg->Attr[attrCount];
memcpy( *tbuf, ptr, item_cnt * sizeof(pwr_tTime));
memcpy( *vbuf, (char *)ptr + item_cnt * sizeof(pwr_tTime), databufsize );
*rows = item_cnt;
int i = 0;
for( i = 0; i < rmsg->NumAttributes; i++ ) {
strncpy(attrptr[i].aname, rmsg->Attr[i].aname, sizeof(attrptr[0].aname));
attrptr[i].type = rmsg->Attr[i].type;
attrptr[i].size = rmsg->Attr[i].size;
}
*histattr = attrptr;
qcom_Free( sts, rmsg);
*sts = SEV__SUCCESS;
return 1;
}
int sevcli_delete_item( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, char *aname) int sevcli_delete_item( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, char *aname)
{ {
sev_sMsgHistItemDelete *msg; sev_sMsgHistItemDelete *msg;
......
...@@ -76,7 +76,10 @@ int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, ...@@ -76,7 +76,10 @@ int sevcli_get_itemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid,
pwr_tTime **tbuf, void **vbuf, int *rows, pwr_tTime **tbuf, void **vbuf, int *rows,
pwr_eType *vtype, unsigned int *vsize); pwr_eType *vtype, unsigned int *vsize);
int sevcli_delete_item( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, char *aname); int sevcli_delete_item( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, char *aname);
int sevcli_get_objectitemdata( pwr_tStatus *sts, sevcli_tCtx ctx, pwr_tOid oid, char *aname,
pwr_tTime starttime, pwr_tTime endtime, int numpoints,
pwr_tTime **tbuf, void **vbuf, int *rows,
sevcli_sHistAttr **histattr, int *numattributes);
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -42,6 +42,7 @@ SObject pwrb:Class ...@@ -42,6 +42,7 @@ SObject pwrb:Class
! below the current signal object. ! below the current signal object.
! !
! @b See also ! @b See also
! @classlink SevHistObject pwrb_sevhistobject.html
! @classlink SevHistThread pwrb_sevhistthread.html ! @classlink SevHistThread pwrb_sevhistthread.html
! @classlink SevHistMonitor pwrb_sevhistmonitor.html ! @classlink SevHistMonitor pwrb_sevhistmonitor.html
! @classlink SevHistServer pwrb_sevhistserver.html ! @classlink SevHistServer pwrb_sevhistserver.html
......
...@@ -33,6 +33,7 @@ SObject pwrb:Class ...@@ -33,6 +33,7 @@ SObject pwrb:Class
! @b See also ! @b See also
! @classlink SevHistThread pwrb_sevhistthread.html ! @classlink SevHistThread pwrb_sevhistthread.html
! @classlink SevHist pwrb_sevhist.html ! @classlink SevHist pwrb_sevhist.html
! @classlink SevHistObject pwrb_sevhistobject.html
! @classlink SevHistServer pwrb_sevhistserver.html ! @classlink SevHistServer pwrb_sevhistserver.html
!*/ !*/
Object SevHistMonitor $ClassDef 534 Object SevHistMonitor $ClassDef 534
......
!
! Proview $Id: pwrb_c_sevhistobject.wb_load,v 1.2 2009-11-24 16:06:00 claes Exp $
! Copyright (C) 2005 SSAB Oxelsund AB.
!
! This program is free software; you can redistribute it and/or
! modify it under the terms of the GNU General Public License as
! published by the Free Software Foundation, either version 2 of
! the License, or (at your option) any later version.
!
! This program is distributed in the hope that it will be useful
! but WITHOUT ANY WARRANTY; without even the implied warranty of
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! GNU General Public License for more details.
!
! You should have received a copy of the GNU General Public License
! along with the program, if not, write to the Free Software
! Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
!
! pwrb_c_sevhistobject.wb_load -- Defines the class SevHistObject.
!
SObject pwrb:Class
!/**
! @Version 2.0
! @Group PlantConfiguration,SevHist
! @Summary Configures historical data storage for an objects all attribute values.
! Configures historical data storage for x scalar
! quantitites or elements in x number of one-dimensional vectors. (Datastorage
! History).
!
! In a relational database, data resides in
! two-dimensional tables known as relations. A relation
! consist of rows and columns.
!
! The SevHistObject object specifies which quantity is to be
! stored and in which relation. Up to three different
! relations can be specified.
!
! @b See also
! @classlink SevHist pwrb_sevhist.html
! @classlink SevHistThread pwrb_sevhistthread.html
! @classlink SevHistMonitor pwrb_sevhistmonitor.html
! @classlink SevHistServer pwrb_sevhistserver.html
!*/
Object SevHistObject $ClassDef 539
Body SysBody
Attr Editor = pwr_eEditor_AttrEd
Attr Method = pwr_eMethod_Standard
EndBody
Object RtBody $ObjBodyDef 1
Body SysBody
Attr StructName = "SevHistObject"
EndBody
!/**
! Optional desription.
!*/
Object Description $Attribute 1
Body SysBody
Attr TypeRef = "pwrs:Type-$String80"
EndBody
EndObject
!/**
! Specifies the complete name of the object whose
! attribute values is to be stored.
!*/
Object Object $Attribute 2
Body SysBody
Attr TypeRef = "pwrs:Type-$AttrRef"
EndBody
EndObject
!/**
! SevHistThread object that specifies the storage scantime
! and in which server the data is stored.
!*/
Object ThreadObject $Attribute 3
Body SysBody
Attr TypeRef = "pwrs:Type-$Objid"
EndBody
EndObject
!/**
! Time the data will be stored in the database.
! Data that is older than this time will be removed from
! the database by a garbage collector.
!*/
Object StorageTime $Attribute 4
Body SysBody
Attr TypeRef = "pwrs:Type-$DeltaTime"
EndBody
EndObject
!/**
! The deadband is a range around the last stored value, where no new values
! will be stored, i.e a value has to differ more than the deadband / 2 from
! the last stored value to be stored.
!
! Deadband contains the size of deadband. Note that the DeadBand bit in options also
! has to be set to activte the deadband function.
!*/
Object DeadBand $Attribute 5
Body SysBody
Attr TypeRef = "pwrs:Type-$Float32"
EndBody
EndObject
!/**
! Storage options.
!*/
Object Options $Attribute 6
Body SysBody
Attr TypeRef = "pwrb:Type-SevHistOptionsMask"
EndBody
EndObject
EndObject
Object Template SevHistObject
Body RtBody
Attr DeadBand = 0.0
Attr Options = 4
EndBody
EndObject
Object PostCreate $DbCallBack
Body SysBody
Attr MethodName = "SevHist-PostCreate"
EndBody
EndObject
Object PostMove $DbCallBack
Body SysBody
Attr MethodName = "SevHist-PostMove"
EndBody
EndObject
Object ConfiguratorPoson $Menu
Object Pointed $Menu
Object ConnectThread $MenuButton
Body SysBody
Attr ButtonName = "Connect SevHistThread"
Attr MethodName = "$Objid-Connect"
Attr MethodArguments[0] = "ThreadObject"
Attr MethodArguments[1] = "SevHistThread"
Attr FilterName = "$Objid-IsOkConnect"
Attr FilterArguments[0] = "ThreadObject"
Attr FilterArguments[1] = "SevHistThread"
EndBody
EndObject
EndObject
EndObject
EndObject
EndSObject
...@@ -37,6 +37,7 @@ SObject pwrb:Class ...@@ -37,6 +37,7 @@ SObject pwrb:Class
! @classlink SevHistThread pwrb_sevhistthread.html ! @classlink SevHistThread pwrb_sevhistthread.html
! @classlink SevHistMonitor pwrb_sevhistmonitor.html ! @classlink SevHistMonitor pwrb_sevhistmonitor.html
! @classlink SevHist pwrb_sevhist.html ! @classlink SevHist pwrb_sevhist.html
! @classlink SevHistObject pwrb_sevhistobject.html
!*/ !*/
Object SevServer $ClassDef 535 Object SevServer $ClassDef 535
Body SysBody Body SysBody
......
...@@ -706,11 +706,19 @@ wb_orep *wb_vrepmem::createObject(pwr_tStatus *sts, wb_cdef cdef, wb_destination ...@@ -706,11 +706,19 @@ wb_orep *wb_vrepmem::createObject(pwr_tStatus *sts, wb_cdef cdef, wb_destination
if ( d.oid().oix == 0) { if ( d.oid().oix == 0) {
dest = root_object; dest = root_object;
if ( !root_object) {
if ( code == ldh_eDest_After)
code = ldh_eDest_IntoLast;
if ( code == ldh_eDest_Before)
code = ldh_eDest_IntoFirst;
}
else {
if ( code == ldh_eDest_IntoLast) if ( code == ldh_eDest_IntoLast)
code = ldh_eDest_After; code = ldh_eDest_After;
if ( code == ldh_eDest_IntoFirst) if ( code == ldh_eDest_IntoFirst)
code = ldh_eDest_Before; code = ldh_eDest_Before;
} }
}
else { else {
dest = findObject( d.oid().oix); dest = findObject( d.oid().oix);
if ( !dest) { if ( !dest) {
......
...@@ -51,10 +51,11 @@ XttSevHistGtk::XttSevHistGtk( void *parent_ctx, ...@@ -51,10 +51,11 @@ XttSevHistGtk::XttSevHistGtk( void *parent_ctx,
pwr_tOid *xn_oid, pwr_tOid *xn_oid,
pwr_tOName *xn_aname, pwr_tOName *xn_aname,
sevcli_tCtx xn_scctx, sevcli_tCtx xn_scctx,
int *sts) : int *sts, bool sevhistobject) :
XttSevHist( parent_ctx, name, xn_oid, xn_aname, xn_scctx, sts), parent_widget(parent_wid) XttSevHist( parent_ctx, name, xn_oid, xn_aname, xn_scctx, sts, sevhistobject), parent_widget(parent_wid)
{ {
char title[250]; char title[250];
strncpy(title, name, sizeof(title));
if ( EVEN(*sts)) if ( EVEN(*sts))
// Error from XttSevHist // Error from XttSevHist
......
...@@ -37,7 +37,8 @@ class XttSevHistGtk : public XttSevHist { ...@@ -37,7 +37,8 @@ class XttSevHistGtk : public XttSevHist {
pwr_tOid *xn_oid, pwr_tOid *xn_oid,
pwr_tOName *xn_aname, pwr_tOName *xn_aname,
sevcli_tCtx xn_scctx, sevcli_tCtx xn_scctx,
int *sts); int *sts,
bool sevhistobject);
~XttSevHistGtk(); ~XttSevHistGtk();
}; };
......
...@@ -221,11 +221,11 @@ XttTrend *XNavGtk::xtttrend_new( char *name, pwr_tAttrRef *objar, pwr_tAttrRef * ...@@ -221,11 +221,11 @@ XttTrend *XNavGtk::xtttrend_new( char *name, pwr_tAttrRef *objar, pwr_tAttrRef *
} }
XttSevHist *XNavGtk::xttsevhist_new( char *name, pwr_tOid *oid, pwr_tOName *aname, XttSevHist *XNavGtk::xttsevhist_new( char *name, pwr_tOid *oid, pwr_tOName *aname,
sevcli_tCtx scctx, pwr_tStatus *sts) sevcli_tCtx scctx, pwr_tStatus *sts, bool sevhistobject)
{ {
GtkWidget *w; GtkWidget *w;
return new XttSevHistGtk( this, parent_wid, name, &w, oid, aname, scctx, sts); return new XttSevHistGtk( this, parent_wid, name, &w, oid, aname, scctx, sts, sevhistobject);
} }
XttFast *XNavGtk::xttfast_new( char *name, pwr_tAttrRef *objar, pwr_tStatus *sts) XttFast *XNavGtk::xttfast_new( char *name, pwr_tAttrRef *objar, pwr_tStatus *sts)
......
...@@ -59,7 +59,7 @@ class XNavGtk : public XNav { ...@@ -59,7 +59,7 @@ class XNavGtk : public XNav {
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 *oid, pwr_tOName *aname,
sevcli_tCtx scctx, pwr_tStatus *sts); sevcli_tCtx scctx, pwr_tStatus *sts, bool sevhistobject=false);
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);
......
...@@ -422,7 +422,7 @@ static pwr_tStatus OpenHistory( xmenu_sMenuCall *ip) ...@@ -422,7 +422,7 @@ static pwr_tStatus OpenHistory( xmenu_sMenuCall *ip)
sts = gdh_GetAttrRefTid( objar, &classid); sts = gdh_GetAttrRefTid( objar, &classid);
if ( EVEN(sts)) return sts; if ( EVEN(sts)) return sts;
if ( classid == pwr_cClass_SevHist || classid == pwr_cClass_PlotGroup) { if ( classid == pwr_cClass_SevHist || classid == pwr_cClass_SevHistObject || classid == pwr_cClass_PlotGroup) {
sts = gdh_AttrrefToName( &ip->Pointed, name, sizeof(name), sts = gdh_AttrrefToName( &ip->Pointed, name, sizeof(name),
cdh_mName_volumeStrict); cdh_mName_volumeStrict);
if ( EVEN(sts)) return sts; if ( EVEN(sts)) return sts;
...@@ -444,7 +444,7 @@ static pwr_tStatus OpenHistory( xmenu_sMenuCall *ip) ...@@ -444,7 +444,7 @@ static pwr_tStatus OpenHistory( xmenu_sMenuCall *ip)
// Default XttGraph found // Default XttGraph found
sts = gdh_GetAttrRefTid( &defhist, &classid); sts = gdh_GetAttrRefTid( &defhist, &classid);
if ( ODD(sts) && if ( ODD(sts) &&
(classid == pwr_cClass_SevHist || classid == pwr_cClass_PlotGroup)) { (classid == pwr_cClass_SevHist || classid == pwr_cClass_SevHistObject || classid == pwr_cClass_PlotGroup)) {
sts = gdh_AttrrefToName( &defhist, name, sizeof(name), sts = gdh_AttrrefToName( &defhist, name, sizeof(name),
cdh_mName_volumeStrict); cdh_mName_volumeStrict);
...@@ -467,7 +467,7 @@ static pwr_tStatus OpenHistory( xmenu_sMenuCall *ip) ...@@ -467,7 +467,7 @@ static pwr_tStatus OpenHistory( xmenu_sMenuCall *ip)
sts = gdh_GetObjectClass( oid, &classid); sts = gdh_GetObjectClass( oid, &classid);
if ( EVEN(sts)) return sts; if ( EVEN(sts)) return sts;
if ( classid == pwr_cClass_SevHist) { if ( classid == pwr_cClass_SevHist || classid == pwr_cClass_SevHistObject) {
found++; found++;
if ( found == 1) if ( found == 1)
child = oid; child = oid;
...@@ -516,7 +516,7 @@ static pwr_tStatus OpenHistoryFilter( xmenu_sMenuCall *ip) ...@@ -516,7 +516,7 @@ static pwr_tStatus OpenHistoryFilter( xmenu_sMenuCall *ip)
sts = gdh_GetAttrRefTid( objar, &classid); sts = gdh_GetAttrRefTid( objar, &classid);
if ( EVEN(sts)) return sts; if ( EVEN(sts)) return sts;
if ( classid == pwr_cClass_SevHist || classid == pwr_cClass_PlotGroup) { if ( classid == pwr_cClass_SevHist || classid == pwr_cClass_SevHistObject || classid == pwr_cClass_PlotGroup) {
return XNAV__SUCCESS; return XNAV__SUCCESS;
} }
...@@ -531,7 +531,7 @@ static pwr_tStatus OpenHistoryFilter( xmenu_sMenuCall *ip) ...@@ -531,7 +531,7 @@ static pwr_tStatus OpenHistoryFilter( xmenu_sMenuCall *ip)
// Default XttGraph found // Default XttGraph found
sts = gdh_GetAttrRefTid( &defhist, &classid); sts = gdh_GetAttrRefTid( &defhist, &classid);
if ( ODD(sts) && if ( ODD(sts) &&
(classid == pwr_cClass_SevHist || classid == pwr_cClass_PlotGroup)) (classid == pwr_cClass_SevHist || classid == pwr_cClass_SevHistObject || classid == pwr_cClass_PlotGroup))
return XNAV__SUCCESS; return XNAV__SUCCESS;
} }
...@@ -544,7 +544,7 @@ static pwr_tStatus OpenHistoryFilter( xmenu_sMenuCall *ip) ...@@ -544,7 +544,7 @@ static pwr_tStatus OpenHistoryFilter( xmenu_sMenuCall *ip)
sts = gdh_GetObjectClass( child, &classid); sts = gdh_GetObjectClass( child, &classid);
if ( EVEN(sts)) return sts; if ( EVEN(sts)) return sts;
if ( classid == pwr_cClass_SevHist) if ( classid == pwr_cClass_SevHist || classid == pwr_cClass_SevHistObject)
return XNAV__SUCCESS; return XNAV__SUCCESS;
sts = gdh_GetNextSibling( child, &child); sts = gdh_GetNextSibling( child, &child);
......
...@@ -50,9 +50,10 @@ XttSevHist::XttSevHist( void *parent_ctx, ...@@ -50,9 +50,10 @@ XttSevHist::XttSevHist( void *parent_ctx,
pwr_tOid *xn_oid, pwr_tOid *xn_oid,
pwr_tOName *xn_aname, pwr_tOName *xn_aname,
sevcli_tCtx xn_scctx, sevcli_tCtx xn_scctx,
int *sts) : int *sts,
bool sevhistobject) :
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) first_scan(1), scctx(xn_scctx), oid(xn_oid[0]), time_low_old(0), time_high_old(0), sevhistobject(sevhistobject)
{ {
strncpy( aname, xn_aname[0], sizeof(aname)); strncpy( aname, xn_aname[0], sizeof(aname));
...@@ -70,6 +71,9 @@ XttSevHist::~XttSevHist() ...@@ -70,6 +71,9 @@ 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 ) {
return get_objectdata(sts, from, to);
}
pwr_tTime *tbuf; pwr_tTime *tbuf;
void *vbuf; void *vbuf;
pwr_tDeltaTime trange; pwr_tDeltaTime trange;
...@@ -167,6 +171,151 @@ int XttSevHist::get_data( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to) ...@@ -167,6 +171,151 @@ int XttSevHist::get_data( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to)
return 1; return 1;
} }
int XttSevHist::get_objectdata( pwr_tStatus *sts, pwr_tTime from, pwr_tTime to)
{
pwr_tTime *tbuf;
void *vbuf;
sevcli_sHistAttr *histattrbuf;
int numAttributes;
pwr_tDeltaTime trange;
sevcli_get_objectitemdata( sts, scctx, oid, aname, from, to, 1000, &tbuf, &vbuf,
&rows, &histattrbuf, &numAttributes);
if ( EVEN(*sts))
return 0;
// Create data for time axis
gcd = new GeCurveData( curve_eDataType_DsTrend);
gcd->data[0] = (double *) calloc( 1, 8 * rows);
for ( int i = 0; i < rows; i++)
gcd->data[0][i] = (double)tbuf[i].tv_sec + (double)1e-9 * tbuf[i].tv_nsec;
strcpy( gcd->name[0], "Time");
gcd->axis_type[0] = curve_eAxis_x;
strcpy( gcd->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;
gcd->cols = 1;
for( int i = 0; i < numAttributes; i++) {
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( gcd->cols >= CURVE_MAX_COLS ) {
printf("To many columns for curve class max:%d\n", CURVE_MAX_COLS);
break;
}
gcd->cols++;
strcpy( gcd->name[gcd->cols-1], histattrbuf[i].aname);
gcd->data[gcd->cols-1] = (double *) calloc( 1, 8 * rows);
gcd->axis_type[gcd->cols-1] = curve_eAxis_y;
dataptr = (char *)vbuf + tmp;
//tmp += histattrbuf[i].size;
for ( int j = 0; j < rows; j++) {
//dataptr = (char *)dataptr + linesize*j;
dataptr = ((char *)vbuf)+ j * linesize + tmp;
switch ( histattrbuf[i].type ) {
case pwr_eType_Int64:
gcd->data[gcd->cols-1][j] = *(pwr_tInt64 *)dataptr;
break;
case pwr_eType_Int32:
gcd->data[gcd->cols-1][j] = *(pwr_tInt32 *)dataptr;
break;
case pwr_eType_Int16:
gcd->data[gcd->cols-1][j] = *(pwr_tInt16 *)dataptr;
break;
case pwr_eType_Int8:
gcd->data[gcd->cols-1][j] = *(pwr_tInt8 *)dataptr;
break;
case pwr_eType_UInt64:
gcd->data[gcd->cols-1][j] = *(pwr_tUInt64 *)dataptr;
break;
case pwr_eType_UInt32:
gcd->data[gcd->cols-1][j] = *(pwr_tUInt32 *)dataptr;
break;
case pwr_eType_UInt16:
gcd->data[gcd->cols-1][j] = *(pwr_tUInt16 *)dataptr;
break;
case pwr_eType_UInt8:
gcd->data[gcd->cols-1][j] = *(pwr_tUInt8 *)dataptr;
break;
case pwr_eType_Float32:
gcd->data[gcd->cols-1][j] = *(pwr_tFloat32 *)dataptr;
break;
case pwr_eType_Float64:
gcd->data[gcd->cols-1][j] = *(pwr_tFloat64 *)dataptr;
break;
case pwr_eType_Boolean:
gcd->data[gcd->cols-1][j] = *(pwr_tBoolean *)dataptr;
break;
default:
*sts = SEV__CURVETYPE;
return 0;
}
}
tmp += histattrbuf[i].size;
}
free( tbuf);
free( vbuf);
free( histattrbuf);
gcd->rows = 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->format[0], "%10t");
else
strcpy( gcd->format[0], "%11t");
}
else
strcpy( gcd->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;
}
void XttSevHist::pop() void XttSevHist::pop()
{ {
curve->pop(); curve->pop();
......
...@@ -73,6 +73,7 @@ class XttSevHist { ...@@ -73,6 +73,7 @@ class XttSevHist {
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
//! Constructor //! Constructor
XttSevHist( void *xn_parent_ctx, XttSevHist( void *xn_parent_ctx,
...@@ -80,7 +81,7 @@ class XttSevHist { ...@@ -80,7 +81,7 @@ class XttSevHist {
pwr_tOid* xn_oid, pwr_tOid* xn_oid,
pwr_tOName *xn_aname, pwr_tOName *xn_aname,
sevcli_tCtx xn_scctx, sevcli_tCtx xn_scctx,
int *sts); int *sts, bool sevhistobject);
//! Destructor //! Destructor
virtual ~XttSevHist(); virtual ~XttSevHist();
...@@ -88,6 +89,7 @@ class XttSevHist { ...@@ -88,6 +89,7 @@ class XttSevHist {
//! Pop sevhist window. //! Pop sevhist window.
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);
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);
......
...@@ -337,7 +337,7 @@ class XNav { ...@@ -337,7 +337,7 @@ class XNav {
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 *oid, pwr_tOName *aname,
sevcli_tCtx scctx, pwr_tStatus *sts) {return 0;} sevcli_tCtx scctx, pwr_tStatus *sts, bool sevhistobject=false) {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;}
......
...@@ -3120,6 +3120,7 @@ static int xnav_open_func( void *client_data, ...@@ -3120,6 +3120,7 @@ static int xnav_open_func( void *client_data,
pwr_tAttrRef aref; pwr_tAttrRef aref;
pwr_tAName aname; pwr_tAName aname;
char *s; char *s;
bool sevHistObjectFound = false;
// Command is "OPEN HISTORY" // Command is "OPEN HISTORY"
...@@ -3177,6 +3178,9 @@ static int xnav_open_func( void *client_data, ...@@ -3177,6 +3178,9 @@ static int xnav_open_func( void *client_data,
switch ( classid) { switch ( classid) {
case pwr_cClass_SevHist: case pwr_cClass_SevHist:
break; break;
case pwr_cClass_SevHistObject:
sevHistObjectFound = true;
break;
case pwr_cClass_PlotGroup: case pwr_cClass_PlotGroup:
xnav->message('E', "Not yet implemented"); xnav->message('E', "Not yet implemented");
return XNAV__HOLDCOMMAND; return XNAV__HOLDCOMMAND;
...@@ -3187,6 +3191,29 @@ static int xnav_open_func( void *client_data, ...@@ -3187,6 +3191,29 @@ static int xnav_open_func( void *client_data,
if ( plotgroup_found) if ( plotgroup_found)
break; break;
if( sevHistObjectFound ) {
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[i][0] = '\0';
}
else {
strcpy( anamev[i], s+1);
}
oidv[i] = aref.Objid;
}
else {
sts = gdh_ArefANameToAref( &sevhist_aref, "Attribute", &attr_aref); sts = gdh_ArefANameToAref( &sevhist_aref, "Attribute", &attr_aref);
if ( EVEN(sts)) return sts; if ( EVEN(sts)) return sts;
...@@ -3206,6 +3233,7 @@ static int xnav_open_func( void *client_data, ...@@ -3206,6 +3233,7 @@ static int xnav_open_func( void *client_data,
strcpy( anamev[i], s+1); strcpy( anamev[i], s+1);
oidv[i] = aref.Objid; oidv[i] = aref.Objid;
}
// Get server and connect to server // Get server and connect to server
sts = gdh_ArefANameToAref( &sevhist_aref, "ThreadObject", &attr_aref); sts = gdh_ArefANameToAref( &sevhist_aref, "ThreadObject", &attr_aref);
...@@ -3251,6 +3279,12 @@ static int xnav_open_func( void *client_data, ...@@ -3251,6 +3279,12 @@ static int xnav_open_func( void *client_data,
xnav->message('E', "Not yet implemented"); xnav->message('E', "Not yet implemented");
return XNAV__HOLDCOMMAND; return XNAV__HOLDCOMMAND;
} }
else if( sevHistObjectFound ) {
hist = xnav->xttsevhist_new( title_str, oidv, anamev, xnav->scctx, &sts, true);
if ( ODD(sts)) {
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, xnav->scctx, &sts);
if ( ODD(sts)) { if ( ODD(sts)) {
......
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