Merge branch 'master' of ssh://gitlab.psi.ch/sinqdev/sicspsi
This commit is contained in:
2
make_gen
2
make_gen
@ -26,7 +26,7 @@ OBJ=psi.o buffer.o ruli.o sps.o pimotor.o \
|
||||
pfeifferprot.o termprot.o phytron.o autowin.o eigera2.o \
|
||||
jvlprot.o \
|
||||
eigermono.o sputterprot.o zwickroll.o astriumnet.o poldifold.o \
|
||||
epicsadapter.o
|
||||
epicsadapter.o zebraswap.o
|
||||
|
||||
.SECONDARY.: sanslirebin.c
|
||||
|
||||
|
2
psi.c
2
psi.c
@ -126,7 +126,7 @@ static void AddPsiCommands(SicsInterp * pInter)
|
||||
SCMD("MakeEigerMono", InitEigerMono);
|
||||
PCMD("cnvrt", CnvrtAction);
|
||||
SCMD("MakeEpicsAdapter", MakeEpicsAdapter);
|
||||
|
||||
PCMD("zebraswap", ZebraSwap);
|
||||
/*
|
||||
* Tcl 8.5 has implemented the clock command in tcl rather then C.
|
||||
* This includes the same command, backported from Tcl 8.4
|
||||
|
79
zebraswap.c
Normal file
79
zebraswap.c
Normal file
@ -0,0 +1,79 @@
|
||||
/*
|
||||
|
||||
This is an ugly hack to swap histogram memory data on ZEBRA.
|
||||
Ported over from sinqhttp.c. Fixing this properly would mean changes
|
||||
to the HM code. Which in turn would affect AMOR and BOA too. I also
|
||||
do not seem to need magic swaps at AMOR or BOA.....
|
||||
|
||||
copyright: see file COPYRIGHT
|
||||
|
||||
Mark Koennecke, December 2016
|
||||
|
||||
*/
|
||||
|
||||
#include <sics.h>
|
||||
#include <histmem.h>
|
||||
#include <sicshipadaba.h>
|
||||
|
||||
/*---------------------------------------------------------------*/
|
||||
static void swapTrics(HistInt *data, int xdim, int ydim)
|
||||
{
|
||||
int x,y, length;
|
||||
HistInt *tmpData = NULL, val;
|
||||
|
||||
length = xdim*ydim;
|
||||
tmpData = malloc(length*sizeof(HistInt));
|
||||
if(tmpData == NULL){
|
||||
return;
|
||||
}
|
||||
memcpy(tmpData, data, length*sizeof(HistInt));
|
||||
for(y = 0; y < ydim; y++){
|
||||
for(x = 0; x < xdim; x++){
|
||||
val = tmpData[x*ydim + y];
|
||||
data[y*xdim+x] = val;
|
||||
}
|
||||
}
|
||||
free(tmpData);
|
||||
}
|
||||
/*----------------------------------------------------------------*/
|
||||
int ZebraSwap(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||
int argc, char *argv[])
|
||||
{
|
||||
int xdim, ydim, status;
|
||||
pHdb dataNode = NULL;
|
||||
hdbValue val;
|
||||
|
||||
if(argc < 4) {
|
||||
SCWrite(pCon,"ERROR: insufficient number of argument to zebraswap\nUsage: zebraswap hmdatanode xdim ydim", eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
dataNode = FindHdbIntern(argv[1]);
|
||||
if(dataNode == NULL){
|
||||
SCPrintf(pCon,eError,"ERROR: data node %s not found", argv[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
status = Tcl_GetInt(InterpGetTcl(pSics),argv[2],&xdim);
|
||||
if(status != TCL_OK){
|
||||
SCPrintf(pCon,eError,"ERROR: failed to convert %s to integer", argv[2]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
status = Tcl_GetInt(InterpGetTcl(pSics),argv[3],&ydim);
|
||||
if(status != TCL_OK){
|
||||
SCPrintf(pCon,eError,"ERROR: failed to convert %s to integer", argv[3]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
val = dataNode->value;
|
||||
if(val.dataType != HIPINTVARAR || val.arrayLength < xdim*ydim){
|
||||
SCWrite(pCon,"ERROR: data type or dimension mismatch between node and parameters", eError);
|
||||
return 0;
|
||||
}
|
||||
|
||||
swapTrics((HistInt *)val.v.intArray,xdim,ydim);
|
||||
|
||||
SCSendOK(pCon);
|
||||
return 1;
|
||||
}
|
Reference in New Issue
Block a user