- Fixes to hkl code
- Fixes to make RITA work - tasub extended to calculate UB from cell alone, support for elastic mode - New MultiCounter as abstraction for counting on HM's - regression test driver for counters
This commit is contained in:
208
hipadaba.c
208
hipadaba.c
@@ -290,6 +290,60 @@ hdbValue makeHdbValue(int datatype, int length){
|
||||
}
|
||||
return val;
|
||||
}
|
||||
/*------------------------------------------------------------------------*/
|
||||
hdbValue makeHdbData(int datatype, int length, void *data){
|
||||
hdbValue val;
|
||||
|
||||
memset(&val,0,sizeof(hdbValue));
|
||||
val.dataType = datatype;
|
||||
|
||||
switch(datatype){
|
||||
case HIPINT:
|
||||
if(data != NULL){
|
||||
memcpy(&val.v.intValue,data,sizeof(int));
|
||||
}
|
||||
break;
|
||||
case HIPFLOAT:
|
||||
if(data != NULL){
|
||||
memcpy(&val.v.doubleValue,data,sizeof(double));
|
||||
}
|
||||
break;
|
||||
case HIPINTAR:
|
||||
case HIPINTVARAR:
|
||||
val.arrayLength = length;
|
||||
val.v.intArray = malloc(length*sizeof(int));
|
||||
if(val.v.intArray != NULL){
|
||||
memset(val.v.intArray,0,length*sizeof(int));
|
||||
}
|
||||
if(data != NULL){
|
||||
memcpy(val.v.intArray,data,length*sizeof(int));
|
||||
}
|
||||
break;
|
||||
case HIPFLOATAR:
|
||||
case HIPFLOATVARAR:
|
||||
val.arrayLength = length;
|
||||
val.v.floatArray = malloc(length*sizeof(double));
|
||||
if(val.v.floatArray != NULL){
|
||||
memset(val.v.floatArray,0,length*sizeof(double));
|
||||
}
|
||||
if(data != NULL){
|
||||
memcpy(val.v.floatArray,data,length*sizeof(double));
|
||||
}
|
||||
break;
|
||||
case HIPTEXT:
|
||||
if(data != NULL){
|
||||
val.v.text = strdup((char *)data);
|
||||
} else {
|
||||
val.v.text = strdup("UNKNOWN");
|
||||
}
|
||||
val.arrayLength = strlen(val.v.text);
|
||||
break;
|
||||
case HIPOBJ:
|
||||
val.v.obj = data;
|
||||
break;
|
||||
}
|
||||
return val;
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
hdbValue MakeHdbInt(int initValue){
|
||||
hdbValue result;
|
||||
@@ -411,6 +465,13 @@ int compareHdbValue(hdbValue v1, hdbValue v2){
|
||||
}
|
||||
return 1;
|
||||
break;
|
||||
case HIPOBJ:
|
||||
if(v2.v.obj == v1.v.obj) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
@@ -424,6 +485,35 @@ int cloneHdbValue(hdbValue *source, hdbValue *clone){
|
||||
clone->dataType = source->dataType;
|
||||
return copyHdbValue(source, clone);
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
int getHdbValueLength(hdbValue v){
|
||||
int length = 0;
|
||||
switch(v.dataType){
|
||||
case HIPNONE:
|
||||
break;
|
||||
case HIPINT:
|
||||
length = sizeof(int);
|
||||
break;
|
||||
case HIPFLOAT:
|
||||
length = sizeof(double);
|
||||
break;
|
||||
case HIPINTAR:
|
||||
case HIPINTVARAR:
|
||||
length = v.arrayLength * sizeof(int);
|
||||
break;
|
||||
case HIPFLOATAR:
|
||||
case HIPFLOATVARAR:
|
||||
length = v.arrayLength * sizeof(double);
|
||||
break;
|
||||
case HIPTEXT:
|
||||
length = strlen(v.v.text);
|
||||
break;
|
||||
case HIPOBJ:
|
||||
length = sizeof(void *);
|
||||
break;
|
||||
}
|
||||
return length;
|
||||
}
|
||||
/*================= node functions ========================================*/
|
||||
pHdb MakeHipadabaNode(char *name, int datatype, int length){
|
||||
pHdb pNew = NULL;
|
||||
@@ -655,7 +745,6 @@ void AppendHipadabaCallback(pHdb node, int type, pHdbCallback newCB){
|
||||
newCB->previous = current;
|
||||
}
|
||||
}
|
||||
/*-------------------------------------------------------------------------*/
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void PrependHipadabaCallback(pHdb node, int type, pHdbCallback newCB){
|
||||
switch(type){
|
||||
@@ -779,6 +868,9 @@ int copyHdbValue(hdbValue *source, hdbValue *target){
|
||||
target->v.floatArray[i] = source->v.floatArray[i];
|
||||
}
|
||||
break;
|
||||
case HIPOBJ:
|
||||
target->v.obj = source->v.obj;
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
* unknown data type
|
||||
@@ -818,3 +910,117 @@ int GetHipadabaPar(pHdb node, hdbValue *v, void *callData){
|
||||
copyHdbValue(&node->value,v);
|
||||
return 1;
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static int calcDataLength(pHdb node, int testLength){
|
||||
int length = 0;
|
||||
|
||||
length = getHdbValueLength(node->value);
|
||||
if(node->value.dataType == HIPFLOATVARAR ||
|
||||
node->value.dataType == HIPINTVARAR ||
|
||||
node->value.dataType == HIPTEXT){
|
||||
length = testLength;
|
||||
}
|
||||
return length;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int SetHdbPar(pHdb node, int dataType, void *data, int length,
|
||||
void *callData){
|
||||
int status;
|
||||
hdbValue v;
|
||||
|
||||
if(node->value.dataType == HIPNONE){
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(dataType != node->value.dataType){
|
||||
return HDBTYPEMISMATCH;
|
||||
}
|
||||
if(length != calcDataLength(node,length)){
|
||||
return HDBLENGTHMISMATCH;
|
||||
}
|
||||
|
||||
v = makeHdbData(dataType, length, data);
|
||||
status = InvokeCallbackChain(node->writeCallbacks, node, callData, v);
|
||||
if(status == 1) {
|
||||
copyHdbValue(&v,&node->value);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
/*--------------------------------------------------------------------------*/
|
||||
int UpdateHdbPar(pHdb node, int dataType, void *data, int length,
|
||||
void *callData){
|
||||
int status;
|
||||
hdbValue v;
|
||||
|
||||
if(node->value.dataType == HIPNONE){
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(dataType != node->value.dataType){
|
||||
return HDBTYPEMISMATCH;
|
||||
}
|
||||
if(length != calcDataLength(node,length)){
|
||||
return HDBLENGTHMISMATCH;
|
||||
}
|
||||
|
||||
v = makeHdbData(dataType,length,data);
|
||||
|
||||
status = InvokeCallbackChain(node->updateCallbacks, node, callData, v);
|
||||
if(status == 1) {
|
||||
copyHdbValue(&v,&node->value);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
int GetHdbPar(pHdb node, int dataType, void *data, int length,
|
||||
void *callData){
|
||||
int status, toCopy;
|
||||
hdbValue v;
|
||||
|
||||
if(dataType != node->value.dataType){
|
||||
return HDBTYPEMISMATCH;
|
||||
}
|
||||
|
||||
if(length != calcDataLength(node,length)){
|
||||
return HDBLENGTHMISMATCH;
|
||||
}
|
||||
|
||||
status = InvokeCallbackChain(node->readCallbacks, node, callData, v);
|
||||
if(status != 1 ){
|
||||
return status;
|
||||
}
|
||||
switch(dataType){
|
||||
case HIPNONE:
|
||||
break;
|
||||
case HIPINT:
|
||||
memcpy(data,&node->value.v.intValue,sizeof(int));
|
||||
break;
|
||||
case HIPFLOAT:
|
||||
memcpy(data,&node->value.v.doubleValue,sizeof(double));
|
||||
break;
|
||||
case HIPINTAR:
|
||||
case HIPINTVARAR:
|
||||
memcpy(data,node->value.v.intArray,
|
||||
node->value.arrayLength*sizeof(int));
|
||||
break;
|
||||
case HIPTEXT:
|
||||
toCopy = strlen(node->value.v.text);
|
||||
if(toCopy > length){
|
||||
toCopy = length;
|
||||
}
|
||||
memcpy(data,&node->value.v.text, toCopy);
|
||||
break;
|
||||
case HIPFLOATAR:
|
||||
case HIPFLOATVARAR:
|
||||
memcpy(data,node->value.v.floatArray,
|
||||
node->value.arrayLength*sizeof(double));
|
||||
break;
|
||||
case HIPOBJ:
|
||||
memcpy(data,&node->value.v.obj,sizeof(void *));
|
||||
break;
|
||||
default:
|
||||
assert(0);
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user