Files
sicspsi/poldifold.c
Mark Koennecke fb2164ca2d Made astriumnet and poldifold work
Astriumnet had problems:
- The hash code stuff is number size dependent
- wrPos was not properly reset, thus leading to no new request being
  written.
Poldifold was tested and taken into operation
2014-04-22 15:45:40 +02:00

100 lines
2.9 KiB
C

/**
* With the new POLDI chopper there is only one chopper start signal but 4 equivalent
* quadrants on the chopper. This leads to the fact that the same pattern is repeated
* four times throughout the time intervall. This code now folds this onto one again.
* Yet another case where a shortcoming of the HW has to be resolved in software.
*
* copyright: see file COPYRIGHT
*
* Mark Koennecke, April 2014
*/
#include <sics.h>
#include <sicshipadaba.h>
#include <stptok.h>
static int PoldiFold (pSConnection pCon, pSicsInterp pInter, void
*pData, int argc, char *argv[])
{
pHdb source, target, dim;
int *sourceData, *targetData, *sourceCurrent, *targetCurrent;
unsigned int nDet, nTof, nSourceTof;
int offset[4], i, j, k;
char num[20], *pPtr;
if(argc < 4) {
SCWrite(pCon,"ERROR: not enough arguments to poldifold",eError);
return 0;
}
/*
reading and checking arguments
*/
source = FindHdbNode(NULL,argv[1],pCon);
target = FindHdbNode(NULL,argv[2],pCon);
if(source == NULL || target == NULL){
SCPrintf(pCon,eError,"ERROR: source %s or target %s path invalid",
argv[1], argv[2]);
return 0;
}
pPtr = argv[3];
for(i = 0; i < 4; i++){
pPtr = stptok(pPtr,num,sizeof(num),",");
if(pPtr == NULL){
SCWrite(pCon,"ERROR: not enough values in the offset list",eError);
return 0;
}
offset[i] = atoi(num);
}
pPtr = stptok(pPtr,num,sizeof(num),",");
if(pPtr == NULL){
SCWrite(pCon,"ERROR: not enough values in the offset list",eError);
return 0;
}
nTof = atoi(num);
dim = GetHipadabaNode(source->mama,"dim");
if(dim == NULL){
SCPrintf(pCon,eError,"ERROR: failed to find dimensions beneath %s, no HM?",
argv[1]);
return 0;
}
nDet = dim->value.v.intArray[0];
nSourceTof = dim->value.v.intArray[1];
/*
ensure enough space to write
*/
if(target->value.arrayLength != nDet*nTof){
free(target->value.v.intArray);
target->value.v.intArray = malloc(nDet*nTof*sizeof(int));
if(target->value.v.intArray == NULL){
SCWrite(pCon,"ERROR: out of memory in poldifold",eError);
return 0;
}
target->value.arrayLength = nDet*nTof;
}
sourceData = source->value.v.intArray;
targetData = target->value.v.intArray;
memset(targetData,0,nDet*nTof*sizeof(int));
for(i = 0; i < nDet; i++){
sourceCurrent = sourceData + i*nSourceTof;
targetCurrent = targetData + i*nTof;
for(j = 0; j < 4; j++){
for(k = 0; k < nTof; k++){
targetCurrent[k] += sourceCurrent[offset[j] + k];
}
}
}
NotifyHipadabaPar(target,pCon);
SCSendOK(pCon);
return 1;
}
/*-----------------------------------------------------------------*/
int MakePoldiFold (pSConnection pCon, pSicsInterp pInter, void
*pData, int argc, char *argv[])
{
AddCommand(pInter, "poldifold", PoldiFold, NULL, NULL);
return 1;
}