+++ /dev/null
-file trbExample.template {
-# {TRBADDR=0x1201, REGADDR=Temperature, TRBADDRWave=0xFE51}
-{TRBADDR=0xffff, REGADDR=Temperature, TRBADDRWave=0xffff}
-#{TRBADDR=0x8300, REGADDR=ADC_2, TRBADDRWave=0x8300}
-#{TRBADDR=0x8300, REGADDR=ADC_1, TRBADDRWave=0x8300}
-#{TRBADDR=0x8300, REGADDR=ADC_0, TRBADDRWave=0x8300}
-
-#{TRBADDR=0x1201, REGADDR=Temperature, TRBADDRWave=0x1201}
-#{TRBADDR=0x0202, REGADDR=0xc804}
-#{TRBADDR=0x0203, REGADDR=0xc804}
-}
-
-file trbADC.template {
- {TRBADDR=0x8300, REGADDR=ADC_3, TRBADDRWave=0x8300}
- {TRBADDR=0xe600, REGADDR=ADC_1, TRBADDRWave=0x1226}
-}
+++ /dev/null
-/****** I N C L U D E S *******************************************************/\r
-\r
-/* ANSI C includes */\r
-#include <stdbool.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <math.h>\r
-\r
-/* EPICS includes */\r
-#include <alarm.h>\r
-#include <cantProceed.h>\r
-#include <dbAccess.h>\r
-#include <dbFldTypes.h>\r
-#include <dbScan.h>\r
-#include <devSup.h>\r
-#include <errlog.h>\r
-#include <epicsExport.h>\r
-#include <epicsTypes.h>\r
-#include <iocLog.h>\r
-#include <iocsh.h>\r
-#include <longinRecord.h>\r
-#include <longoutRecord.h>\r
-#include <recGbl.h>\r
-#include <waveformRecord.h>\r
-\r
-/* local includes */\r
-#include "trberror.h"\r
-#include "trbnet.h"\r
-\r
-\r
-#define LINELENGTH 250\r
-\r
-#define NumberOfBoards 1\r
-\r
-#define __Name 0\r
-#define __Scale 1\r
-#define __Unit 2\r
-#define __Format 3\r
-#define __Start 4\r
-#define __Bits 5\r
-#define __Rate 6\r
-#define __ErrorFlag 7\r
-#define __InvertFlag 8\r
-#define __Value 9\r
-\r
-/****** D E F I N I T I O N S **************************************************/\r
-static long initLi( longinRecord* prec );\r
-static long initLo( longoutRecord* prec );\r
-static long initWaveform( waveformRecord* prec );\r
-static long processLi( longinRecord* prec );\r
-static long processLo( longoutRecord* prec );\r
-static long processWaveform( waveformRecord* prec );\r
-\r
-typedef struct {\r
- long number;\r
- DEVSUPFUN dev_report;\r
- DEVSUPFUN init;\r
- DEVSUPFUN init_record;\r
- DEVSUPFUN get_ioint_info;\r
- DEVSUPFUN process;\r
-} dev_dset_trbnet_t;\r
-\r
-typedef struct {\r
- epicsUInt16 trb_addr;\r
- char* reg_name_buf;\r
- char* reg_name_buf_nbr;\r
- epicsUInt16 reg_addr;\r
- //char entity_name[20];\r
-} trbnet_info_t;\r
-\r
-typedef struct{\r
- epicsUInt16 regAddr;\r
- char *name;\r
- float scale;\r
- char *unit;\r
- char *format;\r
- int start;\r
- int bits;\r
- int rate;\r
- char *errorflag;\r
- char *invertflag;\r
- int value;\r
-}field_struct;\r
-\r
-typedef struct{\r
- epicsUInt16 regAddr;\r
- char *name;\r
- char *purpose;\r
- field_struct *field;\r
- int size;\r
- int used;\r
- int value;\r
-}reg_struct;\r
-\r
-typedef struct{\r
- epicsUInt16 address;\r
- char *name;\r
- reg_struct *Reg;\r
- size_t size;\r
- size_t used;\r
-}trb_struct;\r
-\r
-/****** G L O B A L S **********************************************************/\r
-dev_dset_trbnet_t dev_trbnet_li = { 6, NULL, NULL, initLi, NULL, processLi };\r
-dev_dset_trbnet_t dev_trbnet_lo = { 6, NULL, NULL, initLo, NULL, processLo };\r
-dev_dset_trbnet_t dev_trbnet_waveform = { 6, NULL, NULL, initWaveform, NULL, processWaveform };\r
-trb_struct *trb;\r
-int databaseSet = 0;\r
-\r
-/****** L O C A L S ************************************************************/\r
-static bool _trb_connected = false;\r
-\r
-/****** F U N C T I O N S ******************************************************/\r
-\r
-epicsExportAddress( dset, dev_trbnet_li );\r
-epicsExportAddress( dset, dev_trbnet_lo );\r
-epicsExportAddress( dset, dev_trbnet_waveform );\r
-\r
-/*----- TEST FUNKTION ---------------------------------------------------------*/\r
-int trb_register_readTESTFUNKTION( uint16_t trb_addr,\r
- uint16_t addr,\r
- uint32_t *data,\r
- unsigned int dsize)\r
-{\r
- int status = 0;\r
- if (trb_addr== 0) {\r
- if (addr== 0) {\r
- data[0] = 0;\r
- //data[1]=21400000; \r
- data[1] = 557842432;\r
- }\r
- return 2;\r
- }\r
- else if(trb_addr == 1) {\r
- data[0] = 0;\r
- data[1] = 557842432;\r
- data[2] = 1;\r
- data[3] = 557845532;\r
- data[4] = 2;\r
- data[5] = 557823451;\r
- data[6] = 3;\r
- data[7] = 557733332;\r
- data[8] = 4;\r
- data[9] = 667823451;\r
- data[10] = 5;\r
- data[11] = 598733332;\r
- return 12;\r
- } else {\r
- return -1;\r
- }\r
-}\r
-\r
-int PadiwaSendCmd(uint32_t cmd, uint32_t board, uint32_t chain) {\r
- \r
- uint32_t c[] = { cmd,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1<<chain,0x10001};\r
- int i=0;\r
- //for (i=0;i<99;i++){\r
- trb_register_write_mem(board,0xd400,0,c,18);\r
-// fprintf(stderr,"ERR: %s \n",trb_strerror());\r
- usleep(100);\r
- //}\r
- uint32_t c_ret[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\r
- int ret=0;\r
- ret = trb_register_read(board,0xd412,c_ret,18);\r
- \r
-// fprintf(stderr,"1.: %08x 2:. %08x \n",c_ret[0], c_ret[1]);\r
- \r
- return c_ret[1];\r
-}\r
-\r
-\r
-/*----- Necessary Functions for Database --------------------------------------*/\r
-\r
-void initField(trb_struct *trb, size_t RegNumb) {\r
- trb->Reg[RegNumb].field = (field_struct *)malloc(sizeof(field_struct)); // 1 field\r
- trb->Reg[RegNumb].used = 0;\r
- trb->Reg[RegNumb].size = 1;\r
- //Init with start values\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].regAddr = trb->Reg[RegNumb].regAddr;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].name = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].scale = 1;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].unit = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].format = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].start = 0;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].bits = 32;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].rate = -1;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].errorflag = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].invertflag = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].value = -1;\r
-}\r
-\r
-void initReg(trb_struct *trb, size_t initialSize) {\r
- trb->Reg = (reg_struct *)malloc(initialSize * sizeof(reg_struct));\r
- trb->used = 0;\r
- trb->size = initialSize;\r
- int i=0;\r
- for ( i; i < initialSize; i++) {\r
- initField(trb, i); // trb_struct; i01= Element of Register\r
- }\r
-}\r
-\r
-// Insert a new field. Only RegAddress is Set from default\r
-void insertField(reg_struct *reg) {\r
- if (reg->used == reg->size) {\r
- reg->size++;\r
- reg->field = (field_struct *)realloc(reg->field, reg->size * sizeof(field_struct));\r
- }\r
- //Init with start values\r
- reg->field[reg->used].regAddr = reg->regAddr; //set register Address\r
- reg->field[reg->used].name = NULL;\r
- reg->field[reg->used].scale = 1;\r
- reg->field[reg->used].unit = NULL;\r
- reg->field[reg->used].format = NULL;\r
- reg->field[reg->used].start = 0;\r
- reg->field[reg->used].bits = 32;\r
- reg->field[reg->used].rate = -1;\r
- reg->field[reg->used].errorflag = NULL;\r
- reg->field[reg->used].invertflag = NULL;\r
- reg->field[reg->used].value = -1;\r
- reg->used++;\r
-}\r
-\r
-int setFieldPropertyInt(reg_struct *reg,int fieldNmb, int element, int data) {\r
- if (fieldNmb < reg->used) {\r
- if (element == __Start){ //field start\r
- reg->field[fieldNmb].start = data;\r
- } else if (element == __Bits){ //field bits\r
- reg->field[fieldNmb].bits = data;\r
- } else if (element == __Rate){ //field rate\r
- reg->field[fieldNmb].rate = data;\r
- } else if (element == __Value){ //field ratevalue\r
- reg->field[fieldNmb].value = data;\r
- } else {\r
- printf("Element does not Fit to a INT Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error\r
- }\r
-}\r
-\r
-int setFieldPropertyStr(reg_struct *reg,int fieldNmb, int element, char *data) {\r
- if (fieldNmb < reg->used) {\r
- if(element == __Name){ //field NAME\r
- reg->field[fieldNmb].name =strdup(data);\r
- } else if (element == __Unit){ //field UNIT\r
- reg->field[fieldNmb].unit = strdup(data);\r
- } else if (element == __Format){ //field format\r
- reg->field[fieldNmb].format = strdup(data);\r
- } else if (element == __ErrorFlag){ //field errorflag\r
- reg->field[fieldNmb].errorflag = strdup(data);\r
- } else if (element == __InvertFlag){//field invertflag\r
- reg->field[fieldNmb].invertflag = strdup(data);\r
- } else {\r
- printf("Element does not Fit to a STRING Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error; Field does not exist\r
- }\r
-}\r
-\r
-int setFieldPropertyFloat(reg_struct *reg, int fieldNmb, int element, float data) {\r
- if (fieldNmb < reg->used) {\r
- if (element == __Scale){ //field SCALE\r
- reg->field[fieldNmb].scale = data;\r
- } else {\r
- printf("Element does not Fit to a FLOAT Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error; Field does not exist\r
- }\r
-}\r
-\r
-void insertReg(trb_struct *trb, int element) {\r
- if (trb->used == trb->size) {\r
- trb->size++;\r
- trb->Reg = (reg_struct *)realloc(trb->Reg, trb->size * sizeof(reg_struct));\r
- }\r
- trb->Reg[trb->used].regAddr = element;\r
- initField(trb, trb->used);\r
- trb->used++;\r
-}\r
-\r
-// free the allocated memory of the fields of each Register\r
-void freeField(trb_struct *trb) {\r
- int i=0;\r
- for (i;i<trb->used;i++){\r
- free(trb->Reg[i].field);\r
- trb->Reg[i].field = NULL;\r
- trb->Reg[i].used = trb->Reg[i].size = 0;\r
- }\r
-}\r
-\r
-// free the allocated memory of each register\r
-void freeReg(trb_struct *trb) {\r
- freeField(trb);\r
- free(trb->Reg);\r
- trb->Reg = NULL;\r
- trb->used = trb->size = 0;\r
-}\r
-\r
-/*----- Common initialization for all records ---------------------------------*/\r
-\r
-static long initCommon( dbCommon* prec, DBLINK* plink ) {\r
-\r
- trbnet_info_t *pinfo;\r
- char entity_name_buf[20] = "";\r
- char Reg_name_buf[20] = "";\r
- epicsUInt32 trb_addr_buf = 0;\r
- epicsUInt32 reg_addr_buf = 0;\r
- \r
- char linebuffer[LINELENGTH];\r
-\r
- if ( sscanf( plink->value.instio.string, "%s %x %s", entity_name_buf, &trb_addr_buf, Reg_name_buf ) != 3 ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid value of INP/OUT field '%s'\033[0m\n",\r
- prec->name, plink->value.instio.string );\r
- return -1;\r
- }\r
- if ( 0xffff < trb_addr_buf ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid trb address '%x'\033[0m\n",\r
- prec->name, trb_addr_buf );\r
- return -1;\r
- }\r
-\r
- pinfo = callocMustSucceed( 1, sizeof(*pinfo), "devTrbnet::initCommon" );\r
- pinfo->trb_addr = (epicsUInt16)( trb_addr_buf & 0xffff );\r
-// pinfo->reg_name_buf = strdup(Reg_name_buf);\r
- prec->dpvt = pinfo;\r
- prec->udf = FALSE;\r
- int i=0;\r
-\r
- // check special cases that are not inb XMLS Database\r
- char * pname;\r
-// char reg_name_buf[30];\r
-// strcpy(reg_name_buf, pinfo->reg_name_buf);\r
- pname = strtok(Reg_name_buf,"_");\r
- pinfo->reg_name_buf = strdup(pname);\r
-\r
- while (pname != NULL){\r
-// printf("Ausgabe: %s\n",pname);\r
- pinfo->reg_name_buf_nbr = strdup(pname);\r
- pname = strtok(NULL," ");\r
- \r
- }\r
-printf("test: %s\n",pinfo->reg_name_buf);\r
-printf("test2: %s\n",pinfo->reg_name_buf_nbr);\r
-//----------------------------------------------------------------//\r
- \r
- \r
-\r
-// create Memory for each TrbBoard\r
- if (databaseSet==0)\r
- { \r
- trb = (trb_struct *) malloc(NumberOfBoards * sizeof(trb_struct));\r
-\r
- for(i=0;i<NumberOfBoards;i++){\r
- initReg(&trb[i], 1); // initially 2 Registers in first Trb; also inits first field\r
- }\r
- \r
- //read the entity-file from cache\r
- int gaddress=-1;\r
- int raddress=-1,bits=0,start=0,rate=0,unit=0;\r
- float scale=0.;\r
- bool register_open=false,field_open=false,group_open=false;\r
- char node[20]="",gname[25]="",gmode[2]="",rname[25]="",purpose[25]="",fname[20]="",fformat[10]="";\r
- int trb_status; \r
- char* filepath = {"/home/pi/daqtools/xml-db/database/"};\r
- char* name = {"TrbNet"};\r
- char filename[strlen(filepath)+strlen(entity_name_buf)+5];\r
- snprintf( filename , sizeof( filename ), "%s%s.xml", filepath, entity_name_buf );\r
- FILE *fp;\r
- fp = fopen( filename , "r");\r
- //get each line of document\r
- while(fgets(linebuffer, LINELENGTH, fp)){\r
- char delimiter[] = " ";\r
- char *ptr;\r
- ptr = strtok(linebuffer, delimiter);\r
- sscanf(ptr, "%s", node); \r
- ptr = strtok(NULL, delimiter);\r
-\r
- if (strcmp(node,"<group") == 0){\r
- group_open = true;\r
- }\r
- if (strcmp(node,"</group>") == 0){\r
- group_open = false;\r
- }\r
- if (strcmp(node,"<register") == 0){\r
- for (i=0; i < NumberOfBoards; i++){\r
- insertReg(&trb[i], 0);\r
- }\r
- register_open = true;\r
- }\r
- if (strcmp(node,"</register>") == 0){\r
- register_open = false;\r
- }\r
- if (strcmp(node,"<field") == 0){\r
- for (i=0; i < NumberOfBoards; i++){\r
- insertField(&trb[i].Reg[trb[i].used-1]);\r
- }\r
- field_open = true;\r
- }\r
- if (strcmp(node,"</field>") == 0){\r
- field_open = false;\r
- }\r
- \r
- // analyse each part of one line of .xml document\r
- while(ptr != NULL) {\r
- \r
- if (group_open==true && register_open==false && field_open==false) {\r
- sscanf(ptr, "address=\"%x\"", &gaddress);\r
- sscanf(ptr, "name=\"%[A-z,_0-9]\"", gname);\r
- sscanf(ptr, "mode=\"%[A-z,_,0-9]\"", gmode);\r
- } \r
- if (register_open==true && group_open==true && field_open==false){\r
- if(sscanf(ptr, "address=\"%x\"", ®_addr_buf)==1){\r
- pinfo->reg_addr = (epicsUInt16)( (reg_addr_buf + gaddress) & 0xffff );\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].regAddr = pinfo->reg_addr;\r
- }\r
- }\r
- if(sscanf(ptr, "name=\"%[A-z,_0-9]\"", rname)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].name = strdup(rname);\r
- }\r
- }\r
-\r
- if(sscanf(ptr, "purpose=\"%[A-z,_0-9]\"", purpose)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].purpose = strdup(purpose);\r
- }\r
- }\r
- }\r
-\r
- if (field_open==true && group_open==true && register_open==true){\r
- if (strcmp(ptr,"/>\n") == 0){\r
- field_open=false;\r
- }\r
- if (sscanf(ptr, "name=\"%[A-z,_0-9]\"", fname)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].name = strdup(fname);\r
- }\r
- }\r
- if (sscanf(ptr, "format=\"%[A-z,_0-9]\"", fformat)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].format = strdup(fformat);\r
- }\r
- }\r
- if (sscanf(ptr, "bits=%*c%i%*c", &bits)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].bits = bits;\r
- }\r
- }\r
- if (sscanf(ptr, "start=%*c%i%*c", &start)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].start = start;\r
- }\r
- }\r
- if (sscanf(ptr, "rate=%*c%i%*c", &rate )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].rate = rate;\r
- }\r
- }\r
- if (sscanf(ptr, "unit=%*c%x%*c", &unit )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].unit = unit;\r
- }\r
- }\r
- if (sscanf(ptr, "scale=%*c%f%*c", &scale )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].scale = scale;\r
- }\r
- }\r
- }\r
-\r
- ptr = strtok(NULL, delimiter);\r
- }//end while2\r
- }//end while1\r
-\r
- fclose(fp);\r
- databaseSet = 1;\r
- } \r
- if ( 0xffff < reg_addr_buf ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid register address '%x'\033[0m\n",prec->name, reg_addr_buf );\r
- return -1;\r
- }\r
-\r
-//----------------------------------------------------------------------//\r
-\r
-/* // Test the fields\r
- printf("Register Addres: %i\n", trb[0].Reg[8].regAddr); // getAddr of Register[0]\r
- printf("Number of registers: %i\n", trb[0].size); // print number of fields in Register\r
- printf("Number of fields:%i\n", trb[0].Reg[0].size); // print name of field 1 in Register 0\r
- printf("Number of fields:%s\n", trb[0].Reg[1].field[0].name); // print name of field 1 in Register 0\r
- printf("%i\n", trb[0].used); // getAddr of Register[0]\r
-*/\r
-//---------------------------------------------------------------------------------------------//\r
- /*free memory\r
- for(i=0;i<NumberOfBoards;i++){\r
- freeReg(&trb[i]);\r
- }\r
-\r
- free(trb);\r
- */\r
-//-------------------------------------------------------------------------------------------//\r
- return 0;\r
-}\r
-\r
-/*----- initialization of longin records --------------------------------------*/\r
-static long initLi( longinRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->inp );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- initialization of longout records -------------------------------------*/\r
-static long initLo( longoutRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->out );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- initialization of waveform records ------------------------------------*/\r
-static long initWaveform( waveformRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- if ( DBF_DOUBLE != prec->ftvl ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid field type of value\033[0m\n", prec->name );\r
- return -1;\r
- }\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->inp );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- process routine of longin records -------------------------------------*/\r
-static long processLi( longinRecord* prec ) {\r
- trbnet_info_t* pinfo = (trbnet_info_t*)prec->dpvt;\r
- epicsUInt32 data[2] = { 0 };\r
- int trb_stat = 0;\r
-\r
- int j,k,i,address;\r
- int search_stat = 0 ;\r
- int trb_Nmb=0, reg_Nmb=0, field_Nmb=0;\r
-\r
- if( !_trb_connected ){\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() ); // could be a problem (prec->name)\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-\r
-\r
-\r
- // READ Address from Database\r
- for(i=0;i<NumberOfBoards;i++){\r
-\r
- for(j=0;j<trb[i].used;j++){\r
- if (strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf) == 0){\r
- search_stat = 0;\r
- }\r
- else {\r
- for(k=0;k<trb[i].Reg[j].used;k++){\r
-\r
- if (strcmp(trb[i].Reg[j].field[k].name, pinfo->reg_name_buf) == 0){\r
- address = trb[i].Reg[j].field[k].regAddr;\r
- search_stat = 0;\r
- trb_Nmb=i; reg_Nmb=j; field_Nmb=k;\r
- } else {\r
- search_stat = -1;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (search_stat){\r
- int data_size = 2;\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, data, data_size );\r
- //trb_stat = trb_register_readTESTFUNKTION( pinfo->trb_addr, address, data, data_size );\r
- \r
- //--------------------------------------//\r
- if ( -1 == trb_stat ) {\r
- /* first try failed, do it again */\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, data, data_size );\r
- if ( -1 == trb_stat ) {\r
- /* second try failed, return error */\r
- fprintf( stderr, "\033[31;1m%s: read_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, READ_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- /* Check Status-Bits */\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
- recGblSetSevr( prec, NULL, NULL);\r
- return -1;\r
- }\r
- //------------------------------// \r
- double output = -1;\r
- epicsUInt32 start = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].start);\r
- epicsUInt32 end = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].bits);\r
- double scale = trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].scale;\r
-\r
- for (i=0; i< data_size;i+=2){\r
- output = ((data[i+1]/start)%end )*scale;\r
- prec->val = output;\r
- }\r
- //--------------------------------//\r
-\r
- } else {\r
- printf("No Address Name %s found!\n", pinfo->reg_name_buf);\r
- } \r
-\r
-\r
- return 0;\r
-}\r
-\r
-//----- LONGOUT IS NOT IN USE!!!-----------------------------------------------//\r
-/*----- process routine of longout records ------------------------------------*/\r
-static long processLo( longoutRecord* prec ) {\r
- trbnet_info_t* pinfo = (trbnet_info_t*)prec->dpvt;\r
- epicsUInt32 value = prec->val;\r
- int trb_stat = 0;\r
-\r
- if( !_trb_connected ) {\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-\r
- trb_stat = trb_register_write( pinfo->trb_addr, pinfo->reg_addr, value );\r
- if ( -1 == trb_stat ) {\r
- /* first try failed, do it again */\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_write( pinfo->trb_addr, pinfo->reg_addr, value );\r
- if ( -1 == trb_stat ) {\r
- /* second try failed, return error */\r
- fprintf( stderr, "\033[31;1m%s: write_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, WRITE_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
- return -1;\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-/*----- process routine of waveform records -----------------------------------*/\r
-static long processWaveform( waveformRecord* prec ) {\r
- trbnet_info_t *pinfo = (trbnet_info_t*)prec->dpvt;\r
- epicsUInt32 *pdata_buf;\r
- epicsUInt32 count = 200;//prec->nelm; // equal to 100 boards\r
- int trb_stat = 0;\r
- int i = 0;\r
-\r
- \r
- if( !_trb_connected ) {\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed TEST:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() ); // same as above\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-\r
- pdata_buf = callocMustSucceed( count, sizeof(epicsUInt32), "devTrbnet::processWaveform" );\r
- \r
- int j,k,address;\r
- int search_stat = -1 ;\r
- int trb_Nmb=0, reg_Nmb=0, field_Nmb=0;\r
-\r
- if (strcmp(pinfo->reg_name_buf, "ADC") == 0){\r
- search_stat = 1;\r
-} else {\r
-\r
- for(i=0;i<NumberOfBoards;i++){\r
- \r
- for(j=0;j<trb[i].used;j++){ \r
- \r
- if (search_stat >= 0){\r
- //run without doing smtng\r
- } else {\r
- if (strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf) == 0){\r
- search_stat = 0;\r
- }\r
- else {\r
- for(k=0;k<trb[i].Reg[j].used;k++){\r
- //printf("Test: %i\n",strcmp(trb[i].Reg[j].field[k].name, pinfo->reg_name_buf));\r
-\r
- if (strcmp(trb[i].Reg[j].field[k].name, pinfo->reg_name_buf) == 0){\r
- address = trb[i].Reg[j].field[k].regAddr;\r
- search_stat = 0;\r
- trb_Nmb=i; reg_Nmb=j; field_Nmb=k;\r
- } else {\r
- search_stat = -1;\r
- }\r
- }\r
- }\r
- }//search_stat end if\r
- } \r
- }\r
-\r
-}\r
-\r
- int data_size = 2;\r
- unsigned int mode = 0;\r
-\r
- if (search_stat == 1){\r
- int channel[5] = {7,7,7,6,5};\r
- int resolution[5][4] = {{2,1,2,1},{2,2,2,1},{2,2,2,4},{2,2,2,2},{3,3,2,2}};\r
- double multiplier[5][4] = {{1.,1.,0.5,2.},{1.,1.,0.5,0.},{1.,1.,0.5,3.125},{1.,1.,0.5,0.5},{2.5,1.25,1.,0.5}};\r
- int cmd = 0;\r
-\r
- if (atoi(pinfo->reg_name_buf_nbr)>=0 && atoi(pinfo->reg_name_buf_nbr)<5) {\r
- mode = atoi(pinfo->reg_name_buf_nbr);\r
- } else {\r
- mode = 0;\r
- }\r
-\r
- //prec->nelm = 10;\r
- //prec->bptr = realloc(prec->bptr, prec->nelm * dbValueSize(prec->ftvl));\r
-\r
- double *pvalue = (epicsUInt32*)prec->bptr;\r
-\r
- pvalue[0] = (float) 3.f;\r
- pvalue[1] = (double) 5.;\r
- pvalue[2] = (double) 4.;\r
- pvalue[3] = (double) 1.;\r
-\r
-\r
-/* double output = -1;\r
- for( i=0; i<( prec->nelm/2); i+=1 ){\r
- output = 2.;//((pdata_buf[(i*2)+1]/start)%end ) * scale;\r
- pvalue[i] = 5.;//pdata_buf[i*2];\r
- pvalue[prec->nelm/2 + i] = output;\r
- }\r
-*/\r
-\r
- cmd = 0xc1830000 + ( resolution[mode][0] << 25);\r
- trb_register_write(0x8300,pinfo->trb_addr,25);\r
- PadiwaSendCmd(cmd,pinfo->trb_addr,channel[mode]);\r
- usleep(5000);\r
- cmd = 0xd1830000 + ( resolution[mode][1] << 25);\r
- fprintf(stderr," 1: %f \n",(double) ((( PadiwaSendCmd(cmd,pinfo->trb_addr,channel[mode])>>19)&0xfff)*multiplier[mode][0]));\r
- usleep(5000);\r
- cmd = 0xe1830000 + ( resolution[mode][2] << 25);\r
- fprintf(stderr," 2: %f \n",(double) ((( PadiwaSendCmd(cmd,pinfo->trb_addr,channel[mode])>>19)&0xfff)*multiplier[mode][1]) );\r
- usleep(1000);\r
- cmd = 0xf1830000 + ( resolution[mode][3] << 25);\r
- fprintf(stderr," 3: %f \n",(double) ((( PadiwaSendCmd(cmd,pinfo->trb_addr,channel[mode])>>19)&0xfff)*multiplier[mode][2]) );\r
- usleep(5000);\r
- fprintf(stderr," 4: %f \n",(double) (((PadiwaSendCmd(0xf3930000,pinfo->trb_addr,channel[mode])>>19)&0xfff)*multiplier[mode][3]) );\r
- usleep(5000);\r
- fprintf(stderr," 5: %3.2f \n", (double) (((PadiwaSendCmd(0,pinfo->trb_addr,channel[mode])>>19)&0xfff)/16.));\r
-\r
- trb_register_write(pinfo->trb_addr,0xd41a,7);\r
-\r
- } else if (search_stat == 0) {\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, pdata_buf, count ); //\r
- if ( -1 == trb_stat ) {\r
- /* first try failed, do it again */\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, pdata_buf, count );\r
- if ( -1 == trb_stat ) {\r
- fprintf( stderr, "\033[31;1m%s: read_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- free( pdata_buf );\r
- if (trb_errno == 12){\r
- prec->nelm = prec->nelm * 2;\r
- }\r
- recGblSetSevr( prec, READ_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
-// recGblSetSevr( prec, NULL, NULL );\r
- return -1;\r
- }\r
-\r
- if ( trb_stat != prec->nelm ) { //>\r
- /*int trb_stat_temp = trb_stat;\r
- trb_stat = prec->nelm;\r
- prec->nelm = trb_stat_temp;*/\r
- prec->nelm = trb_stat;\r
- prec->bptr = realloc(prec->bptr, prec->nelm * dbValueSize(prec->ftvl));\r
- }\r
-\r
- double *pvalue = (epicsUInt32*)prec->bptr;\r
-\r
-\r
- //---------------------------------------------------//\r
- double output = -1;\r
- epicsUInt32 start = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].start);\r
- epicsUInt32 end = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].bits);\r
- double scale = trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].scale;\r
- \r
-/* for( i=0; i < trb_stat; i+=2 ) {\r
- output = ((pdata_buf[i+1]/start)%end )*scale;\r
- pvalue[i] = pdata_buf[i];\r
- pvalue[i+1] = output;\r
- }\r
-*/\r
- for( i=0; i<( prec->nelm/2); i+=1 ){\r
- output = ((pdata_buf[(i*2)+1]/start)%end ) * scale;\r
- pvalue[i] = pdata_buf[i*2];\r
- pvalue[i+(trb_stat/2)] = output;\r
- }\r
-\r
- //---------------------------------------------------//\r
-\r
- } else {\r
- printf("No Address Name %s found!\n", pinfo->reg_name_buf);\r
- } \r
-//--------------------------------//\r
- prec->nord = trb_stat;\r
-\r
- free( pdata_buf );\r
-\r
- return 0;\r
-}\r
-\r
+++ /dev/null
-/****** I N C L U D E S *******************************************************/\r
-\r
-/* ANSI C includes */\r
-#include <stdbool.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <math.h>\r
-\r
-/* EPICS includes */\r
-#include <alarm.h>\r
-#include <cantProceed.h>\r
-#include <dbAccess.h>\r
-#include <dbFldTypes.h>\r
-#include <dbScan.h>\r
-#include <devSup.h>\r
-#include <errlog.h>\r
-#include <epicsExport.h>\r
-#include <epicsTypes.h>\r
-#include <iocLog.h>\r
-#include <iocsh.h>\r
-#include <longinRecord.h>\r
-#include <longoutRecord.h>\r
-#include <recGbl.h>\r
-#include <waveformRecord.h>\r
-\r
-/* local includes */\r
-#include "trberror.h"\r
-#include "trbnet.h"\r
-\r
-\r
-#define LINELENGTH 250\r
-\r
-#define NumberOfBoards 1\r
-\r
-#define __Name 0\r
-#define __Scale 1\r
-#define __Unit 2\r
-#define __Format 3\r
-#define __Start 4\r
-#define __Bits 5\r
-#define __Rate 6\r
-#define __ErrorFlag 7\r
-#define __InvertFlag 8\r
-#define __Value 9\r
-\r
-/****** D E F I N I T I O N S **************************************************/\r
-static long initLi( longinRecord* prec );\r
-static long initLo( longoutRecord* prec );\r
-static long initWaveform( waveformRecord* prec );\r
-static long processLi( longinRecord* prec );\r
-static long processLo( longoutRecord* prec );\r
-static long processWaveform( waveformRecord* prec );\r
-\r
-typedef struct {\r
- long number;\r
- DEVSUPFUN dev_report;\r
- DEVSUPFUN init;\r
- DEVSUPFUN init_record;\r
- DEVSUPFUN get_ioint_info;\r
- DEVSUPFUN process;\r
-} dev_dset_trbnet_t;\r
-\r
-typedef struct {\r
- epicsUInt16 trb_addr;\r
- char* reg_name_buf;\r
- epicsUInt16 reg_addr;\r
- //char entity_name[20];\r
-} trbnet_info_t;\r
-\r
-typedef struct{\r
- epicsUInt16 regAddr;\r
- char *name;\r
- float scale;\r
- char *unit;\r
- char *format;\r
- int start;\r
- int bits;\r
- int rate;\r
- char *errorflag;\r
- char *invertflag;\r
- int value;\r
-}field_struct;\r
-\r
-typedef struct{\r
- epicsUInt16 regAddr;\r
- char *name;\r
- char *purpose;\r
- field_struct *field;\r
- int size;\r
- int used;\r
- int value;\r
-}reg_struct;\r
-\r
-typedef struct{\r
- epicsUInt16 address;\r
- char *name;\r
- reg_struct *Reg;\r
- size_t size;\r
- size_t used;\r
-}trb_struct;\r
-\r
-/****** G L O B A L S **********************************************************/\r
-dev_dset_trbnet_t dev_trbnet_li = { 6, NULL, NULL, initLi, NULL, processLi };\r
-dev_dset_trbnet_t dev_trbnet_lo = { 6, NULL, NULL, initLo, NULL, processLo };\r
-dev_dset_trbnet_t dev_trbnet_waveform = { 6, NULL, NULL, initWaveform, NULL, processWaveform };\r
-trb_struct *trb;\r
-int databaseSet = 0;\r
-\r
-/****** L O C A L S ************************************************************/\r
-static bool _trb_connected = false;\r
-\r
-/****** F U N C T I O N S ******************************************************/\r
-\r
-epicsExportAddress( dset, dev_trbnet_li );\r
-epicsExportAddress( dset, dev_trbnet_lo );\r
-epicsExportAddress( dset, dev_trbnet_waveform );\r
-\r
-/*----- TEST FUNKTION ---------------------------------------------------------*/\r
-int trb_register_readTESTFUNKTION( uint16_t trb_addr,\r
- uint16_t addr,\r
- uint32_t *data,\r
- unsigned int dsize)\r
-{\r
- int status = 0;\r
- if (trb_addr== 0) {\r
- if (addr== 0) {\r
- data[0] = 0;\r
- //data[1]=21400000; \r
- data[1] = 557842432;\r
- }\r
- return 2;\r
- }\r
- else if(trb_addr == 1) {\r
- data[0] = 0;\r
- data[1] = 557842432;\r
- data[2] = 1;\r
- data[3] = 557845532;\r
- data[4] = 2;\r
- data[5] = 557823451;\r
- data[6] = 3;\r
- data[7] = 557733332;\r
- data[8] = 4;\r
- data[9] = 667823451;\r
- data[10] = 5;\r
- data[11] = 598733332;\r
- return 12;\r
- } else {\r
- return -1;\r
- }\r
-}\r
-\r
-/*----- Necessary Functions for Database --------------------------------------*/\r
-\r
-void initField(trb_struct *trb, size_t RegNumb) {\r
- trb->Reg[RegNumb].field = (field_struct *)malloc(sizeof(field_struct)); // 1 field\r
- trb->Reg[RegNumb].used = 0;\r
- trb->Reg[RegNumb].size = 1;\r
- //Init with start values\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].regAddr = trb->Reg[RegNumb].regAddr;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].name = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].scale = 1;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].unit = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].format = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].start = 0;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].bits = 32;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].rate = -1;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].errorflag = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].invertflag = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].value = -1;\r
-}\r
-\r
-void initReg(trb_struct *trb, size_t initialSize) {\r
- trb->Reg = (reg_struct *)malloc(initialSize * sizeof(reg_struct));\r
- trb->used = 0;\r
- trb->size = initialSize;\r
- int i=0;\r
- for ( i; i < initialSize; i++) {\r
- initField(trb, i); // trb_struct; i01= Element of Register\r
- }\r
-}\r
-\r
-// Insert a new field. Only RegAddress is Set from default\r
-void insertField(reg_struct *reg) {\r
- if (reg->used == reg->size) {\r
- reg->size++;\r
- reg->field = (field_struct *)realloc(reg->field, reg->size * sizeof(field_struct));\r
- }\r
- //Init with start values\r
- reg->field[reg->used].regAddr = reg->regAddr; //set register Address\r
- reg->field[reg->used].name = NULL;\r
- reg->field[reg->used].scale = 1;\r
- reg->field[reg->used].unit = NULL;\r
- reg->field[reg->used].format = NULL;\r
- reg->field[reg->used].start = 0;\r
- reg->field[reg->used].bits = 32;\r
- reg->field[reg->used].rate = -1;\r
- reg->field[reg->used].errorflag = NULL;\r
- reg->field[reg->used].invertflag = NULL;\r
- reg->field[reg->used].value = -1;\r
- reg->used++;\r
-}\r
-\r
-int setFieldPropertyInt(reg_struct *reg,int fieldNmb, int element, int data) {\r
- if (fieldNmb < reg->used) {\r
- if (element == __Start){ //field start\r
- reg->field[fieldNmb].start = data;\r
- } else if (element == __Bits){ //field bits\r
- reg->field[fieldNmb].bits = data;\r
- } else if (element == __Rate){ //field rate\r
- reg->field[fieldNmb].rate = data;\r
- } else if (element == __Value){ //field ratevalue\r
- reg->field[fieldNmb].value = data;\r
- } else {\r
- printf("Element does not Fit to a INT Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error\r
- }\r
-}\r
-\r
-int setFieldPropertyStr(reg_struct *reg,int fieldNmb, int element, char *data) {\r
- if (fieldNmb < reg->used) {\r
- if(element == __Name){ //field NAME\r
- reg->field[fieldNmb].name =strdup(data);\r
- } else if (element == __Unit){ //field UNIT\r
- reg->field[fieldNmb].unit = strdup(data);\r
- } else if (element == __Format){ //field format\r
- reg->field[fieldNmb].format = strdup(data);\r
- } else if (element == __ErrorFlag){ //field errorflag\r
- reg->field[fieldNmb].errorflag = strdup(data);\r
- } else if (element == __InvertFlag){//field invertflag\r
- reg->field[fieldNmb].invertflag = strdup(data);\r
- } else {\r
- printf("Element does not Fit to a STRING Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error; Field does not exist\r
- }\r
-}\r
-\r
-int setFieldPropertyFloat(reg_struct *reg, int fieldNmb, int element, float data) {\r
- if (fieldNmb < reg->used) {\r
- if (element == __Scale){ //field SCALE\r
- reg->field[fieldNmb].scale = data;\r
- } else {\r
- printf("Element does not Fit to a FLOAT Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error; Field does not exist\r
- }\r
-}\r
-\r
-void insertReg(trb_struct *trb, int element) {\r
- if (trb->used == trb->size) {\r
- trb->size++;\r
- trb->Reg = (reg_struct *)realloc(trb->Reg, trb->size * sizeof(reg_struct));\r
- }\r
- trb->Reg[trb->used].regAddr = element;\r
- initField(trb, trb->used);\r
- trb->used++;\r
-}\r
-\r
-// free the allocated memory of the fields of each Register\r
-void freeField(trb_struct *trb) {\r
- int i=0;\r
- for (i;i<trb->used;i++){\r
- free(trb->Reg[i].field);\r
- trb->Reg[i].field = NULL;\r
- trb->Reg[i].used = trb->Reg[i].size = 0;\r
- }\r
-}\r
-\r
-// free the allocated memory of each register\r
-void freeReg(trb_struct *trb) {\r
- freeField(trb);\r
- free(trb->Reg);\r
- trb->Reg = NULL;\r
- trb->used = trb->size = 0;\r
-}\r
-\r
-/*----- Common initialization for all records ---------------------------------*/\r
-\r
-static long initCommon( dbCommon* prec, DBLINK* plink ) {\r
-\r
- trbnet_info_t *pinfo;\r
- char entity_name_buf[20] = "";\r
- char Reg_name_buf[20] = "";\r
- epicsUInt32 trb_addr_buf = 0;\r
- epicsUInt32 reg_addr_buf = 0;\r
-\r
- char linebuffer[LINELENGTH];\r
-\r
- if ( sscanf( plink->value.instio.string, "%s %x %s", entity_name_buf, &trb_addr_buf, Reg_name_buf ) != 3 ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid value of INP/OUT field '%s'\033[0m\n",\r
- prec->name, plink->value.instio.string );\r
- return -1;\r
- }\r
- if ( 0xffff < trb_addr_buf ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid trb address '%x'\033[0m\n",\r
- prec->name, trb_addr_buf );\r
- return -1;\r
- }\r
-\r
- \r
- pinfo = callocMustSucceed( 1, sizeof(*pinfo), "devTrbnet::initCommon" );\r
- pinfo->trb_addr = (epicsUInt16)( trb_addr_buf & 0xffff );\r
- pinfo->reg_name_buf = strdup(Reg_name_buf);\r
- prec->dpvt = pinfo;\r
- prec->udf = FALSE;\r
- int i=0;\r
- \r
- \r
-\r
-// create Memory for each TrbBoard\r
- if (databaseSet==0)\r
- {\r
- trb = (trb_struct *) malloc(NumberOfBoards * sizeof(trb_struct));\r
-\r
- for(i=0;i<NumberOfBoards;i++){\r
- initReg(&trb[i], 1); // initially 2 Registers in first Trb; also inits first field\r
- }\r
- \r
- //read the entity-file from cache\r
- int gaddress=-1;\r
- int raddress=-1,bits=0,start=0,rate=0,unit=0;\r
- float scale=0.;\r
- bool register_open=false,field_open=false,group_open=false;\r
- char node[20]="",gname[25]="",gmode[2]="",rname[25]="",purpose[25]="",fname[20]="",fformat[10]="";\r
- int trb_status;\r
- char* filepath = {"/home/adrian/workspace/daqtools/xml-db/database/"};\r
- char* name = {"MDC"};\r
- char filename[strlen(filepath)+strlen(entity_name_buf)+5];\r
- snprintf( filename , sizeof( filename ), "%s%s.xml", filepath, entity_name_buf );\r
- //printf("%s\n",filename);\r
- FILE *fp;\r
- fp = fopen( filename , "r");\r
- \r
- //get each line of document\r
- while(fgets(linebuffer, LINELENGTH, fp)){\r
- char delimiter[] = " ";\r
- char *ptr;\r
- ptr = strtok(linebuffer, delimiter);\r
- sscanf(ptr, "%s", node);\r
- ptr = strtok(NULL, delimiter);\r
-\r
- if (strcmp(node,"<group") == 0){\r
- group_open = true;\r
- }\r
- if (strcmp(node,"</group>") == 0){\r
- group_open = false;\r
- }\r
- if (strcmp(node,"<register") == 0){\r
- for (i=0; i < NumberOfBoards; i++){\r
- insertReg(&trb[i], 0);\r
- }\r
- register_open = true;\r
- }\r
- if (strcmp(node,"</register>") == 0){\r
- register_open = false;\r
- }\r
- if (strcmp(node,"<field") == 0){\r
- for (i=0; i < NumberOfBoards; i++){\r
- insertField(&trb[i].Reg[trb[i].used-1]);\r
- }\r
- field_open = true;\r
- }\r
- if (strcmp(node,"</field>") == 0){\r
- field_open = false;\r
- }\r
-\r
- // analyse each part of one line of .xml document\r
- while(ptr != NULL) {\r
- \r
- if (group_open==true && register_open==false && field_open==false) {\r
- sscanf(ptr, "address=\"%x\"", &gaddress);\r
- sscanf(ptr, "name=\"%[A-z,_0-9]\"", gname);\r
- sscanf(ptr, "mode=\"%[A-z,_,0-9]\"", gmode);\r
- } \r
- if (register_open==true && group_open==true && field_open==false){\r
- if(sscanf(ptr, "address=\"%x\"", ®_addr_buf)==1){\r
- pinfo->reg_addr = (epicsUInt16)( (reg_addr_buf + gaddress) & 0xffff );\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].regAddr = pinfo->reg_addr;\r
- }\r
- }\r
- if(sscanf(ptr, "name=\"%[A-z,_0-9]\"", rname)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].name = strdup(rname);\r
- }\r
- }\r
-\r
- if(sscanf(ptr, "purpose=\"%[A-z,_0-9]\"", purpose)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].purpose = strdup(purpose);\r
- }\r
- }\r
- }\r
-\r
- if (field_open==true && group_open==true && register_open==true){\r
- if (strcmp(ptr,"/>\n") == 0){\r
- field_open=false;\r
- }\r
- if (sscanf(ptr, "name=\"%[A-z,_0-9]\"", fname)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].name = strdup(fname);\r
- }\r
- }\r
- if (sscanf(ptr, "format=\"%[A-z,_0-9]\"", fformat)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].format = strdup(fformat);\r
- }\r
- }\r
- if (sscanf(ptr, "bits=%*c%i%*c", &bits)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].bits = bits;\r
- }\r
- }\r
- if (sscanf(ptr, "start=%*c%i%*c", &start)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].start = start;\r
- }\r
- }\r
- if (sscanf(ptr, "rate=%*c%i%*c", &rate )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].rate = rate;\r
- }\r
- }\r
- if (sscanf(ptr, "unit=%*c%x%*c", &unit )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].unit = unit;\r
- }\r
- }\r
- if (sscanf(ptr, "scale=%*c%f%*c", &scale )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].scale = scale;\r
- }\r
- }\r
- }\r
-\r
- ptr = strtok(NULL, delimiter);\r
- }//end while2\r
- }//end while1\r
- fclose(fp);\r
- databaseSet = 1;\r
- } \r
- if ( 0xffff < reg_addr_buf ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid register address '%x'\033[0m\n",prec->name, reg_addr_buf );\r
- return -1;\r
- }\r
-\r
-//----------------------------------------------------------------------//\r
-\r
- // Test the fields\r
- printf("Register Addres: %i\n", trb[0].Reg[8].regAddr); // getAddr of Register[0]\r
- printf("Number of registers: %i\n", trb[0].size); // print number of fields in Register\r
- printf("Number of fields:%i\n", trb[0].Reg[0].size); // print name of field 1 in Register 0\r
- printf("Number of fields:%s\n", trb[0].Reg[1].field[0].name); // print name of field 1 in Register 0\r
- printf("%i\n", trb[0].used); // getAddr of Register[0]\r
-\r
-//---------------------------------------------------------------------------------------------//\r
- /*free memory\r
- for(i=0;i<NumberOfBoards;i++){\r
- freeReg(&trb[i]);\r
- }\r
-\r
- free(trb);\r
- */\r
-//-------------------------------------------------------------------------------------------//\r
- return 0;\r
-}\r
-\r
-/*----- initialization of longin records --------------------------------------*/\r
-static long initLi( longinRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->inp );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- initialization of longout records -------------------------------------*/\r
-static long initLo( longoutRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->out );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- initialization of waveform records ------------------------------------*/\r
-static long initWaveform( waveformRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- if ( DBF_DOUBLE != prec->ftvl ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid field type of value\033[0m\n", prec->name );\r
- return -1;\r
- }\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->inp );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- process routine of longin records -------------------------------------*/\r
-static long processLi( longinRecord* prec ) {\r
- trbnet_info_t* pinfo = (trbnet_info_t*)prec->dpvt;\r
- epicsUInt32 data[2] = { 0 };\r
- int trb_stat = 0;\r
-\r
- int j,k,i,address;\r
- int search_stat = 0 ;\r
- int trb_Nmb=0, reg_Nmb=0, field_Nmb=0;\r
-\r
- if( !_trb_connected ){\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() ); // could be a problem (prec->name)\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-\r
- // READ Address from Database\r
- for(i=0;i<NumberOfBoards;i++){\r
-\r
- for(j=0;j<trb[i].used;j++){\r
- if (strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf) == 0){\r
- search_stat = 0;\r
- }\r
- else {\r
- for(k=0;k<trb[i].Reg[j].used;k++){\r
- if (strcmp(trb[i].Reg[j].field[k].name, pinfo->reg_name_buf) == 0){\r
- address = trb[i].Reg[j].field[k].regAddr;\r
- search_stat = 0;\r
- trb_Nmb=i; reg_Nmb=j; field_Nmb=k;\r
- } else {\r
- search_stat = -1;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (search_stat){\r
- int data_size = 2;\r
- //trb_stat = trb_register_read( pinfo->trb_addr, address, data, data_size );\r
- //trb_stat = trb_register_readTESTFUNKTION( pinfo->trb_addr, address, data, data_size );\r
- \r
- //--------------------------------------//\r
- if ( -1 == trb_stat ) {\r
- /* first try failed, do it again */\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, data, data_size );\r
- if ( -1 == trb_stat ) {\r
- /* second try failed, return error */\r
- fprintf( stderr, "\033[31;1m%s: read_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, READ_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- /* Check Status-Bits */\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
- return -1;\r
- }\r
- //------------------------------// \r
- double output = -1;\r
- epicsUInt32 start = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].start);\r
- epicsUInt32 end = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].bits);\r
- double scale = trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].scale;\r
-\r
- for (i=0; i< data_size;i+=2){\r
- output = ((data[i+1]/start)%end )*scale;\r
- prec->val = output;\r
- }\r
- //--------------------------------//\r
-\r
- } else {\r
- printf("No Address Name %s found!\n", pinfo->reg_name_buf);\r
- } \r
-\r
-\r
- return 0;\r
-}\r
-\r
-//----- LONGOUT IS NOT IN USE!!!-----------------------------------------------//\r
-/*----- process routine of longout records ------------------------------------*/\r
-static long processLo( longoutRecord* prec ) {\r
- trbnet_info_t* pinfo = (trbnet_info_t*)prec->dpvt;\r
- epicsUInt32 value = prec->val;\r
- int trb_stat = 0;\r
-\r
- if( !_trb_connected ) {\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-\r
- trb_stat = trb_register_write( pinfo->trb_addr, pinfo->reg_addr, value );\r
- if ( -1 == trb_stat ) {\r
- /* first try failed, do it again */\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_write( pinfo->trb_addr, pinfo->reg_addr, value );\r
- if ( -1 == trb_stat ) {\r
- /* second try failed, return error */\r
- fprintf( stderr, "\033[31;1m%s: write_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, WRITE_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
- return -1;\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-/*----- process routine of waveform records -----------------------------------*/\r
-static long processWaveform( waveformRecord* prec ) {\r
- trbnet_info_t *pinfo = (trbnet_info_t*)prec->dpvt;\r
- double *pvalue = (epicsUInt32*)prec->bptr;\r
- epicsUInt32 *pdata_buf;\r
- epicsUInt32 count = 200;//prec->nelm; // equal to 100 boards\r
- int trb_stat = 0;\r
- int i = 0;\r
-\r
- \r
- if( !_trb_connected ) {\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() ); // same as above\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-\r
- pdata_buf = callocMustSucceed( count, sizeof(epicsUInt32), "devTrbnet::processWaveform" );\r
- \r
- int j,k,address;\r
- int search_stat = 0 ;\r
- int trb_Nmb=0, reg_Nmb=0, field_Nmb=0;\r
-\r
- for(i=0;i<NumberOfBoards;i++){\r
- \r
- for(j=0;j<trb[i].used;j++){ \r
- if (strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf) == 0){\r
- search_stat = 0;\r
- }\r
- else {\r
- for(k=0;k<trb[i].Reg[j].used;k++){\r
- if (strcmp(trb[i].Reg[j].field[k].name, pinfo->reg_name_buf) == 0){\r
- address = trb[i].Reg[j].field[k].regAddr;\r
- search_stat = 0;\r
- trb_Nmb=i; reg_Nmb=j; field_Nmb=k; \r
- } else {\r
- search_stat = -1; \r
- }\r
- }\r
- }\r
- } \r
- }\r
- int data_size = 2;\r
- if (search_stat){\r
-\r
- //trb_stat = trb_register_readTESTFUNKTION( pinfo->trb_addr, address, pdata_buf, count );\r
-\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, pdata_buf, count );\r
- if ( -1 == trb_stat ) {\r
- /* first try failed, do it again */\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, pdata_buf, count );\r
- if ( -1 == trb_stat ) {\r
- fprintf( stderr, "\033[31;1m%s: read_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- free( pdata_buf );\r
- recGblSetSevr( prec, READ_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
- return -1;\r
- }\r
-\r
- if ( trb_stat > prec->nelm ) {\r
- int trb_stat_temp = trb_stat;\r
- trb_stat = prec->nelm;\r
- prec->nelm = trb_stat_temp;\r
- }\r
-\r
- //---------------------------------------------------//\r
- double output = -1;\r
- epicsUInt32 start = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].start);\r
- epicsUInt32 end = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].bits);\r
- double scale = trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].scale;\r
- \r
- for( i=0; i < trb_stat; i+=2 ) {\r
- output = ((pdata_buf[i+1]/start)%end )*scale;\r
- pvalue[i] = pdata_buf[i];\r
- pvalue[i+1] = output;\r
- }\r
-\r
- //---------------------------------------------------//\r
-\r
- } else {\r
- printf("No Address Name %s found!\n", pinfo->reg_name_buf);\r
- } \r
-//--------------------------------//\r
- prec->nord = trb_stat;\r
-\r
- free( pdata_buf );\r
-\r
- return 0;\r
-}\r
-\r
+++ /dev/null
-/*******************************************************************************
- * Copyright (C) 2013 Florian Feldbauer <florian@ep1.ruhr-uni-bochum.de>
- * - Helmholtz-Institut Mainz
- *
- * This file is part of devTrbnet
- *
- * devTrbnet 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 3 of the License, or
- * (at your option) any later version.
- *
- * devTrbnet 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 this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- ******************************************************************************/
-
-/****** I N C L U D E S *******************************************************/
-
-/* ANSI C includes */
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-/* EPICS includes */
-#include <alarm.h>
-#include <cantProceed.h>
-#include <dbAccess.h>
-#include <dbFldTypes.h>
-#include <dbScan.h>
-#include <devSup.h>
-#include <errlog.h>
-#include <epicsExport.h>
-#include <epicsTypes.h>
-#include <iocLog.h>
-#include <iocsh.h>
-#include <longinRecord.h>
-#include <longoutRecord.h>
-#include <recGbl.h>
-#include <waveformRecord.h>
-
-/* local includes */
-#include "trberror.h"
-#include "trbnet.h"
-
-/****** D E F I N I T I O N S **************************************************/
-static long initLi( longinRecord* prec );
-static long initLo( longoutRecord* prec );
-static long initWaveform( waveformRecord* prec );
-static long processLi( longinRecord* prec );
-static long processLo( longoutRecord* prec );
-static long processWaveform( waveformRecord* prec );
-
-typedef struct {
- long number;
- DEVSUPFUN dev_report;
- DEVSUPFUN init;
- DEVSUPFUN init_record;
- DEVSUPFUN get_ioint_info;
- DEVSUPFUN process;
-} dev_dset_trbnet_t;
-
-typedef struct {
- epicsUInt16 trb_addr;
- epicsUInt16 reg_addr;
-} trbnet_info_t;
-
-/****** G L O B A L S **********************************************************/
-dev_dset_trbnet_t dev_trbnet_li = { 6, NULL, NULL, initLi, NULL, processLi };
-dev_dset_trbnet_t dev_trbnet_lo = { 6, NULL, NULL, initLo, NULL, processLo };
-dev_dset_trbnet_t dev_trbnet_waveform = { 6, NULL, NULL, initWaveform, NULL, processWaveform };
-
-/****** L O C A L S ************************************************************/
-static bool _trb_connected = false;
-
-/****** F U N C T I O N S ******************************************************/
-
-epicsExportAddress( dset, dev_trbnet_li );
-epicsExportAddress( dset, dev_trbnet_lo );
-epicsExportAddress( dset, dev_trbnet_waveform );
-
-/*----- Common initialization for all records ---------------------------------*/
-static long initCommon( dbCommon* prec, DBLINK* plink ) {
-
- trbnet_info_t *pinfo;
- epicsUInt32 trb_addr_buf = 0;
- epicsUInt32 reg_addr_buf = 0;
-
- if ( sscanf( plink->value.instio.string, "%x %x", &trb_addr_buf, ®_addr_buf ) != 2 ) {
- fprintf( stderr, "\033[31;1m%s: Invalid value of INP/OUT field '%s'\033[0m\n",
- prec->name, plink->value.instio.string );
- return -1;
- }
- if ( 0xffff < trb_addr_buf ) {
- fprintf( stderr, "\033[31;1m%s: Invalid trb address '%x'\033[0m\n",
- prec->name, trb_addr_buf );
- return -1;
- }
- if ( 0xffff < reg_addr_buf ) {
- fprintf( stderr, "\033[31;1m%s: Invalid register address '%x'\033[0m\n",
- prec->name, reg_addr_buf );
- return -1;
- }
-
- pinfo = callocMustSucceed( 1, sizeof(*pinfo), "devTrbnet::initCommon" );
- pinfo->trb_addr = (epicsUInt16)( trb_addr_buf & 0xffff );
- pinfo->reg_addr = (epicsUInt16)( reg_addr_buf & 0xffff );
-
- prec->dpvt = pinfo;
- prec->udf = FALSE;
-
- return 0;
-}
-
-/*----- initialization of longin records --------------------------------------*/
-static long initLi( longinRecord* prec ) {
- long status = 0;
- prec->pact = (epicsUInt8)true; /* disable record */
-
- status = initCommon( (dbCommon *)prec, &prec->inp );
- prec->pact = (epicsUInt8)false; /* enable record */
-
- return status;
-}
-
-/*----- initialization of longout records -------------------------------------*/
-static long initLo( longoutRecord* prec ) {
- long status = 0;
- prec->pact = (epicsUInt8)true; /* disable record */
-
- status = initCommon( (dbCommon *)prec, &prec->out );
- prec->pact = (epicsUInt8)false; /* enable record */
-
- return status;
-}
-
-/*----- initialization of waveform records ------------------------------------*/
-static long initWaveform( waveformRecord* prec ) {
- long status = 0;
- prec->pact = (epicsUInt8)true; /* disable record */
-
- if ( DBF_ULONG != prec->ftvl ) {
- fprintf( stderr, "\033[31;1m%s: Invalid field type of value\033[0m\n", prec->name );
- return -1;
- }
-
- status = initCommon( (dbCommon *)prec, &prec->inp );
- prec->pact = (epicsUInt8)false; /* enable record */
-
- return status;
-}
-
-/*----- process routine of longin records -------------------------------------*/
-static long processLi( longinRecord* prec ) {
- trbnet_info_t* pinfo = (trbnet_info_t*)prec->dpvt;
- epicsUInt32 data[2] = { 0 };
- int trb_stat = 0;
-
- if( !_trb_connected ){
- if( init_ports() == -1 ) {
- fprintf( stderr, "\033[31;1m%s: Nr1 init_ports failed:\n%d %s\033[0m\n",
- prec->name, trb_errno, trb_strerror() );
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );
- return -1;
- }
- _trb_connected = true;
- }
-
- trb_stat = trb_register_read( pinfo->trb_addr, pinfo->reg_addr, data, 2 );
- if ( -1 == trb_stat ) {
- /* first try failed, do it again */
- if( init_ports() == -1 ) {
- fprintf( stderr, "\033[31;1m%s: Nr2 init_ports failed:\n%d %s\033[0m\n",
- prec->name, trb_errno, trb_strerror() );
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );
- return -1;
- }
- trb_stat = trb_register_read( pinfo->trb_addr, pinfo->reg_addr, data, 2 );
- if ( -1 == trb_stat ) {
- /* second try failed, return error */
- fprintf( stderr, "\033[31;1m%s: read_register failed: %d %s\033[0m\n",
- prec->name, trb_errno, trb_strerror() );
- recGblSetSevr( prec, READ_ALARM, INVALID_ALARM );
- _trb_connected = false;
- return -1;
- }
- }
- /* Check Status-Bits */
- if ( TRB_STATUS_WARNING == trb_errno ) {
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",
- prec->name, trb_termstr( trb_term ) );
- return -1;
- }
-
- prec->val = data[1];
- return 0;
-}
-
-/*----- process routine of longout records ------------------------------------*/
-static long processLo( longoutRecord* prec ) {
- trbnet_info_t* pinfo = (trbnet_info_t*)prec->dpvt;
- epicsUInt32 value = prec->val;
- int trb_stat = 0;
-
- if( !_trb_connected ) {
- if( init_ports() == -1 ) {
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",
- prec->name, trb_errno, trb_strerror() );
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );
- return -1;
- }
- _trb_connected = true;
- }
-
- trb_stat = trb_register_write( pinfo->trb_addr, pinfo->reg_addr, value );
- if ( -1 == trb_stat ) {
- /* first try failed, do it again */
- if( init_ports() == -1 ) {
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",
- prec->name, trb_errno, trb_strerror() );
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );
- return -1;
- }
- trb_stat = trb_register_write( pinfo->trb_addr, pinfo->reg_addr, value );
- if ( -1 == trb_stat ) {
- /* second try failed, return error */
- fprintf( stderr, "\033[31;1m%s: write_register failed: %d %s\033[0m\n",
- prec->name, trb_errno, trb_strerror() );
- recGblSetSevr( prec, WRITE_ALARM, INVALID_ALARM );
- _trb_connected = false;
- return -1;
- }
- }
- if ( TRB_STATUS_WARNING == trb_errno ) {
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",
- prec->name, trb_termstr( trb_term ) );
- return -1;
- }
-
- return 0;
-}
-
-/*----- process routine of waveform records -----------------------------------*/
-static long processWaveform( waveformRecord* prec ) {
- trbnet_info_t *pinfo = (trbnet_info_t*)prec->dpvt;
- epicsUInt32 *pvalue = (epicsUInt32*)prec->bptr;
- epicsUInt32 *pdata_buf;
- epicsUInt32 count = prec->nelm;
- int trb_stat = 0;
- int i = 0;
-
- if( !_trb_connected ) {
- if( init_ports() == -1 ) {
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",
- prec->name, trb_errno, trb_strerror() );
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );
- return -1;
- }
- _trb_connected = true;
- }
-
- pdata_buf = callocMustSucceed( count, sizeof(epicsUInt32), "devTrbnet::processWaveform" );
-
- trb_stat = trb_register_read( pinfo->trb_addr, pinfo->reg_addr, pdata_buf, count );
- if ( -1 == trb_stat ) {
- /* first try failed, do it again */
- if( init_ports() == -1 ) {
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",
- prec->name, trb_errno, trb_strerror() );
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );
- return -1;
- }
- trb_stat = trb_register_read( pinfo->trb_addr, pinfo->reg_addr, pdata_buf, count );
- if ( -1 == trb_stat ) {
- fprintf( stderr, "\033[31;1m%s: read_register failed: %d %s\033[0m\n",
- prec->name, trb_errno, trb_strerror() );
- free( pdata_buf );
- recGblSetSevr( prec, READ_ALARM, INVALID_ALARM );
- _trb_connected = false;
- return -1;
- }
- }
- if ( TRB_STATUS_WARNING == trb_errno ) {
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",
- prec->name, trb_termstr( trb_term ) );
- return -1;
- }
-
- if ( trb_stat > prec->nelm ) trb_stat = prec->nelm;
- for( ; i < trb_stat; i++ ) pvalue[i] = pdata_buf[i];
-
- prec->nord = trb_stat;
-
- free( pdata_buf );
- return 0;
-}
-
+++ /dev/null
-/****** I N C L U D E S *******************************************************/\r
-\r
-/* ANSI C includes */\r
-#include <stdbool.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <math.h>\r
-\r
-/* EPICS includes */\r
-#include <alarm.h>\r
-#include <cantProceed.h>\r
-#include <dbAccess.h>\r
-#include <dbFldTypes.h>\r
-#include <dbScan.h>\r
-#include <devSup.h>\r
-#include <errlog.h>\r
-#include <epicsExport.h>\r
-#include <epicsTypes.h>\r
-#include <iocLog.h>\r
-#include <iocsh.h>\r
-#include <longinRecord.h>\r
-#include <longoutRecord.h>\r
-#include <recGbl.h>\r
-#include <waveformRecord.h>\r
-\r
-/* local includes */\r
-#include "trberror.h"\r
-#include "trbnet.h"\r
-\r
-\r
-#define LINELENGTH 250\r
-\r
-#define NumberOfBoards 1\r
-\r
-#define __Name 0\r
-#define __Scale 1\r
-#define __Unit 2\r
-#define __Format 3\r
-#define __Start 4\r
-#define __Bits 5\r
-#define __Rate 6\r
-#define __ErrorFlag 7\r
-#define __InvertFlag 8\r
-#define __Value 9\r
-\r
-/****** D E F I N I T I O N S **************************************************/\r
-static long initLi( longinRecord* prec );\r
-static long initLo( longoutRecord* prec );\r
-static long initWaveform( waveformRecord* prec );\r
-static long processLi( longinRecord* prec );\r
-static long processLo( longoutRecord* prec );\r
-static long processWaveform( waveformRecord* prec );\r
-\r
-typedef struct {\r
- long number;\r
- DEVSUPFUN dev_report;\r
- DEVSUPFUN init;\r
- DEVSUPFUN init_record;\r
- DEVSUPFUN get_ioint_info;\r
- DEVSUPFUN process;\r
-} dev_dset_trbnet_t;\r
-\r
-typedef struct {\r
- epicsUInt16 trb_addr;\r
- char* reg_name_buf;\r
- epicsUInt16 reg_addr;\r
- //char entity_name[20];\r
-} trbnet_info_t;\r
-\r
-typedef struct{\r
- epicsUInt16 regAddr;\r
- char *name;\r
- float scale;\r
- char *unit;\r
- char *format;\r
- int start;\r
- int bits;\r
- int rate;\r
- char *errorflag;\r
- char *invertflag;\r
- int value;\r
-}field_struct;\r
-\r
-typedef struct{\r
- epicsUInt16 regAddr;\r
- char *name;\r
- char *purpose;\r
- field_struct *field;\r
- int size;\r
- int used;\r
- int value;\r
-}reg_struct;\r
-\r
-typedef struct{\r
- epicsUInt16 address;\r
- char *name;\r
- reg_struct *Reg;\r
- size_t size;\r
- size_t used;\r
-}trb_struct;\r
-\r
-/****** G L O B A L S **********************************************************/\r
-dev_dset_trbnet_t dev_trbnet_li = { 6, NULL, NULL, initLi, NULL, processLi };\r
-dev_dset_trbnet_t dev_trbnet_lo = { 6, NULL, NULL, initLo, NULL, processLo };\r
-dev_dset_trbnet_t dev_trbnet_waveform = { 6, NULL, NULL, initWaveform, NULL, processWaveform };\r
-trb_struct *trb;\r
-int databaseSet = 0;\r
-\r
-/****** L O C A L S ************************************************************/\r
-static bool _trb_connected = false;\r
-\r
-/****** F U N C T I O N S ******************************************************/\r
-\r
-epicsExportAddress( dset, dev_trbnet_li );\r
-epicsExportAddress( dset, dev_trbnet_lo );\r
-epicsExportAddress( dset, dev_trbnet_waveform );\r
-\r
-/*----- TEST FUNKTION ---------------------------------------------------------*/\r
-int trb_register_readTESTFUNKTION( uint16_t trb_addr,\r
- uint16_t addr,\r
- uint32_t *data,\r
- unsigned int dsize)\r
-{\r
- int status = 0;\r
- if (trb_addr== 0) {\r
- if (addr== 0) {\r
- data[0] = 0;\r
- //data[1]=21400000; \r
- data[1] = 557842432;\r
- }\r
- return 2;\r
- }\r
- else if(trb_addr == 1) {\r
- data[0] = 0;\r
- data[1] = 557842432;\r
- data[2] = 1;\r
- data[3] = 557845532;\r
- data[4] = 2;\r
- data[5] = 557823451;\r
- data[6] = 3;\r
- data[7] = 557733332;\r
- data[8] = 4;\r
- data[9] = 667823451;\r
- data[10] = 5;\r
- data[11] = 598733332;\r
- return 12;\r
- } else {\r
- return -1;\r
- }\r
-}\r
-\r
-/*----- Necessary Functions for Database --------------------------------------*/\r
-\r
-void initField(trb_struct *trb, size_t RegNumb) {\r
- trb->Reg[RegNumb].field = (field_struct *)malloc(sizeof(field_struct)); // 1 field\r
- trb->Reg[RegNumb].used = 0;\r
- trb->Reg[RegNumb].size = 1;\r
- //Init with start values\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].regAddr = trb->Reg[RegNumb].regAddr;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].name = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].scale = 1;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].unit = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].format = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].start = 0;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].bits = 32;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].rate = -1;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].errorflag = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].invertflag = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].value = -1;\r
-}\r
-\r
-void initReg(trb_struct *trb, size_t initialSize) {\r
- trb->Reg = (reg_struct *)malloc(initialSize * sizeof(reg_struct));\r
- trb->used = 0;\r
- trb->size = initialSize;\r
- int i=0;\r
- for ( i; i < initialSize; i++) {\r
- initField(trb, i); // trb_struct; i01= Element of Register\r
- }\r
-}\r
-\r
-// Insert a new field. Only RegAddress is Set from default\r
-void insertField(reg_struct *reg) {\r
- if (reg->used == reg->size) {\r
- reg->size++;\r
- reg->field = (field_struct *)realloc(reg->field, reg->size * sizeof(field_struct));\r
- }\r
- //Init with start values\r
- reg->field[reg->used].regAddr = reg->regAddr; //set register Address\r
- reg->field[reg->used].name = NULL;\r
- reg->field[reg->used].scale = 1;\r
- reg->field[reg->used].unit = NULL;\r
- reg->field[reg->used].format = NULL;\r
- reg->field[reg->used].start = 0;\r
- reg->field[reg->used].bits = 32;\r
- reg->field[reg->used].rate = -1;\r
- reg->field[reg->used].errorflag = NULL;\r
- reg->field[reg->used].invertflag = NULL;\r
- reg->field[reg->used].value = -1;\r
- reg->used++;\r
-}\r
-\r
-int setFieldPropertyInt(reg_struct *reg,int fieldNmb, int element, int data) {\r
- if (fieldNmb < reg->used) {\r
- if (element == __Start){ //field start\r
- reg->field[fieldNmb].start = data;\r
- } else if (element == __Bits){ //field bits\r
- reg->field[fieldNmb].bits = data;\r
- } else if (element == __Rate){ //field rate\r
- reg->field[fieldNmb].rate = data;\r
- } else if (element == __Value){ //field ratevalue\r
- reg->field[fieldNmb].value = data;\r
- } else {\r
- printf("Element does not Fit to a INT Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error\r
- }\r
-}\r
-\r
-int setFieldPropertyStr(reg_struct *reg,int fieldNmb, int element, char *data) {\r
- if (fieldNmb < reg->used) {\r
- if(element == __Name){ //field NAME\r
- reg->field[fieldNmb].name =strdup(data);\r
- } else if (element == __Unit){ //field UNIT\r
- reg->field[fieldNmb].unit = strdup(data);\r
- } else if (element == __Format){ //field format\r
- reg->field[fieldNmb].format = strdup(data);\r
- } else if (element == __ErrorFlag){ //field errorflag\r
- reg->field[fieldNmb].errorflag = strdup(data);\r
- } else if (element == __InvertFlag){//field invertflag\r
- reg->field[fieldNmb].invertflag = strdup(data);\r
- } else {\r
- printf("Element does not Fit to a STRING Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error; Field does not exist\r
- }\r
-}\r
-\r
-int setFieldPropertyFloat(reg_struct *reg, int fieldNmb, int element, float data) {\r
- if (fieldNmb < reg->used) {\r
- if (element == __Scale){ //field SCALE\r
- reg->field[fieldNmb].scale = data;\r
- } else {\r
- printf("Element does not Fit to a FLOAT Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error; Field does not exist\r
- }\r
-}\r
-\r
-void insertReg(trb_struct *trb, int element) {\r
- if (trb->used == trb->size) {\r
- trb->size++;\r
- trb->Reg = (reg_struct *)realloc(trb->Reg, trb->size * sizeof(reg_struct));\r
- }\r
- trb->Reg[trb->used].regAddr = element;\r
- initField(trb, trb->used);\r
- trb->used++;\r
-}\r
-\r
-// free the allocated memory of the fields of each Register\r
-void freeField(trb_struct *trb) {\r
- int i=0;\r
- for (i;i<trb->used;i++){\r
- free(trb->Reg[i].field);\r
- trb->Reg[i].field = NULL;\r
- trb->Reg[i].used = trb->Reg[i].size = 0;\r
- }\r
-}\r
-\r
-// free the allocated memory of each register\r
-void freeReg(trb_struct *trb) {\r
- freeField(trb);\r
- free(trb->Reg);\r
- trb->Reg = NULL;\r
- trb->used = trb->size = 0;\r
-}\r
-\r
-/*----- Common initialization for all records ---------------------------------*/\r
-\r
-static long initCommon( dbCommon* prec, DBLINK* plink ) {\r
-\r
- trbnet_info_t *pinfo;\r
- char entity_name_buf[20] = "";\r
- char Reg_name_buf[20] = "";\r
- epicsUInt32 trb_addr_buf = 0;\r
- epicsUInt32 reg_addr_buf = 0;\r
- \r
- char linebuffer[LINELENGTH];\r
-\r
- if ( sscanf( plink->value.instio.string, "%s %x %s", entity_name_buf, &trb_addr_buf, Reg_name_buf ) != 3 ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid value of INP/OUT field '%s'\033[0m\n",\r
- prec->name, plink->value.instio.string );\r
- return -1;\r
- }\r
- if ( 0xffff < trb_addr_buf ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid trb address '%x'\033[0m\n",\r
- prec->name, trb_addr_buf );\r
- return -1;\r
- }\r
-\r
- \r
- pinfo = callocMustSucceed( 1, sizeof(*pinfo), "devTrbnet::initCommon" );\r
- pinfo->trb_addr = (epicsUInt16)( trb_addr_buf & 0xffff );\r
- pinfo->reg_name_buf = strdup(Reg_name_buf);\r
- prec->dpvt = pinfo;\r
- prec->udf = FALSE;\r
- int i=0;\r
- \r
- \r
-\r
-// create Memory for each TrbBoard\r
- if (databaseSet==0)\r
- { \r
- trb = (trb_struct *) malloc(NumberOfBoards * sizeof(trb_struct));\r
-\r
- for(i=0;i<NumberOfBoards;i++){\r
- initReg(&trb[i], 1); // initially 2 Registers in first Trb; also inits first field\r
- }\r
- \r
- //read the entity-file from cache\r
- int gaddress=-1;\r
- int raddress=-1,bits=0,start=0,rate=0,unit=0;\r
- float scale=0.;\r
- bool register_open=false,field_open=false,group_open=false;\r
- char node[20]="",gname[25]="",gmode[2]="",rname[25]="",purpose[25]="",fname[20]="",fformat[10]="";\r
- int trb_status; \r
- char* filepath = {"/home/aghoehne/TrdNet/daqtools/xml-db/database/"};\r
- char* name = {"TrbNet"};\r
- char filename[strlen(filepath)+strlen(entity_name_buf)+5];\r
- snprintf( filename , sizeof( filename ), "%s%s.xml", filepath, entity_name_buf );\r
- FILE *fp;\r
- fp = fopen( filename , "r");\r
- //get each line of document\r
- while(fgets(linebuffer, LINELENGTH, fp)){\r
- char delimiter[] = " ";\r
- char *ptr;\r
- ptr = strtok(linebuffer, delimiter);\r
- sscanf(ptr, "%s", node); \r
- ptr = strtok(NULL, delimiter);\r
-\r
- if (strcmp(node,"<group") == 0){\r
- group_open = true;\r
- }\r
- if (strcmp(node,"</group>") == 0){\r
- group_open = false;\r
- }\r
- if (strcmp(node,"<register") == 0){\r
- for (i=0; i < NumberOfBoards; i++){\r
- insertReg(&trb[i], 0);\r
- }\r
- register_open = true;\r
- }\r
- if (strcmp(node,"</register>") == 0){\r
- register_open = false;\r
- }\r
- if (strcmp(node,"<field") == 0){\r
- for (i=0; i < NumberOfBoards; i++){\r
- insertField(&trb[i].Reg[trb[i].used-1]);\r
- }\r
- field_open = true;\r
- }\r
- if (strcmp(node,"</field>") == 0){\r
- field_open = false;\r
- }\r
- \r
- // analyse each part of one line of .xml document\r
- while(ptr != NULL) {\r
- \r
- if (group_open==true && register_open==false && field_open==false) {\r
- sscanf(ptr, "address=\"%x\"", &gaddress);\r
- sscanf(ptr, "name=\"%[A-z,_0-9]\"", gname);\r
- sscanf(ptr, "mode=\"%[A-z,_,0-9]\"", gmode);\r
- } \r
- if (register_open==true && group_open==true && field_open==false){\r
- if(sscanf(ptr, "address=\"%x\"", ®_addr_buf)==1){\r
- pinfo->reg_addr = (epicsUInt16)( (reg_addr_buf + gaddress) & 0xffff );\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].regAddr = pinfo->reg_addr;\r
- }\r
- }\r
- if(sscanf(ptr, "name=\"%[A-z,_0-9]\"", rname)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].name = strdup(rname);\r
- }\r
- }\r
-\r
- if(sscanf(ptr, "purpose=\"%[A-z,_0-9]\"", purpose)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].purpose = strdup(purpose);\r
- }\r
- }\r
- }\r
-\r
- if (field_open==true && group_open==true && register_open==true){\r
- if (strcmp(ptr,"/>\n") == 0){\r
- field_open=false;\r
- }\r
- if (sscanf(ptr, "name=\"%[A-z,_0-9]\"", fname)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].name = strdup(fname);\r
- }\r
- }\r
- if (sscanf(ptr, "format=\"%[A-z,_0-9]\"", fformat)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].format = strdup(fformat);\r
- }\r
- }\r
- if (sscanf(ptr, "bits=%*c%i%*c", &bits)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].bits = bits;\r
- }\r
- }\r
- if (sscanf(ptr, "start=%*c%i%*c", &start)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].start = start;\r
- }\r
- }\r
- if (sscanf(ptr, "rate=%*c%i%*c", &rate )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].rate = rate;\r
- }\r
- }\r
- if (sscanf(ptr, "unit=%*c%x%*c", &unit )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].unit = unit;\r
- }\r
- }\r
- if (sscanf(ptr, "scale=%*c%f%*c", &scale )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].scale = scale;\r
- }\r
- }\r
- }\r
-\r
- ptr = strtok(NULL, delimiter);\r
- }//end while2\r
- }//end while1\r
-\r
- fclose(fp);\r
- databaseSet = 1;\r
- } \r
- if ( 0xffff < reg_addr_buf ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid register address '%x'\033[0m\n",prec->name, reg_addr_buf );\r
- return -1;\r
- }\r
-\r
-//----------------------------------------------------------------------//\r
-\r
-/* // Test the fields\r
- printf("Register Addres: %i\n", trb[0].Reg[8].regAddr); // getAddr of Register[0]\r
- printf("Number of registers: %i\n", trb[0].size); // print number of fields in Register\r
- printf("Number of fields:%i\n", trb[0].Reg[0].size); // print name of field 1 in Register 0\r
- printf("Number of fields:%s\n", trb[0].Reg[1].field[0].name); // print name of field 1 in Register 0\r
- printf("%i\n", trb[0].used); // getAddr of Register[0]\r
-*/\r
-//---------------------------------------------------------------------------------------------//\r
- /*free memory\r
- for(i=0;i<NumberOfBoards;i++){\r
- freeReg(&trb[i]);\r
- }\r
-\r
- free(trb);\r
- */\r
-//-------------------------------------------------------------------------------------------//\r
- return 0;\r
-}\r
-\r
-/*----- initialization of longin records --------------------------------------*/\r
-static long initLi( longinRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->inp );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- initialization of longout records -------------------------------------*/\r
-static long initLo( longoutRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->out );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- initialization of waveform records ------------------------------------*/\r
-static long initWaveform( waveformRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- if ( DBF_DOUBLE != prec->ftvl ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid field type of value\033[0m\n", prec->name );\r
- return -1;\r
- }\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->inp );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- process routine of longin records -------------------------------------*/\r
-static long processLi( longinRecord* prec ) {\r
- trbnet_info_t* pinfo = (trbnet_info_t*)prec->dpvt;\r
- epicsUInt32 data[2] = { 0 };\r
- int trb_stat = 0;\r
-\r
- int j,k,i,address;\r
- int search_stat = 0 ;\r
- int trb_Nmb=0, reg_Nmb=0, field_Nmb=0;\r
-\r
- if( !_trb_connected ){\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() ); // could be a problem (prec->name)\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-\r
- // READ Address from Database\r
- for(i=0;i<NumberOfBoards;i++){\r
-\r
- for(j=0;j<trb[i].used;j++){\r
- if (strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf) == 0){\r
- search_stat = 0;\r
- }\r
- else {\r
- for(k=0;k<trb[i].Reg[j].used;k++){\r
- if (strcmp(trb[i].Reg[j].field[k].name, pinfo->reg_name_buf) == 0){\r
- address = trb[i].Reg[j].field[k].regAddr;\r
- search_stat = 0;\r
- trb_Nmb=i; reg_Nmb=j; field_Nmb=k;\r
- } else {\r
- search_stat = -1;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (search_stat){\r
- int data_size = 2;\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, data, data_size );\r
- //trb_stat = trb_register_readTESTFUNKTION( pinfo->trb_addr, address, data, data_size );\r
- \r
- //--------------------------------------//\r
- if ( -1 == trb_stat ) {\r
- /* first try failed, do it again */\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, data, data_size );\r
- if ( -1 == trb_stat ) {\r
- /* second try failed, return error */\r
- fprintf( stderr, "\033[31;1m%s: read_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, READ_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- /* Check Status-Bits */\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
- recGblSetSevr( prec, NULL, NULL);\r
- return -1;\r
- }\r
- //------------------------------// \r
- double output = -1;\r
- epicsUInt32 start = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].start);\r
- epicsUInt32 end = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].bits);\r
- double scale = trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].scale;\r
-\r
- for (i=0; i< data_size;i+=2){\r
- output = ((data[i+1]/start)%end )*scale;\r
- prec->val = output;\r
- }\r
- //--------------------------------//\r
-\r
- } else {\r
- printf("No Address Name %s found!\n", pinfo->reg_name_buf);\r
- } \r
-\r
-\r
- return 0;\r
-}\r
-\r
-//----- LONGOUT IS NOT IN USE!!!-----------------------------------------------//\r
-/*----- process routine of longout records ------------------------------------*/\r
-static long processLo( longoutRecord* prec ) {\r
- trbnet_info_t* pinfo = (trbnet_info_t*)prec->dpvt;\r
- epicsUInt32 value = prec->val;\r
- int trb_stat = 0;\r
-\r
- if( !_trb_connected ) {\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-\r
- trb_stat = trb_register_write( pinfo->trb_addr, pinfo->reg_addr, value );\r
- if ( -1 == trb_stat ) {\r
- /* first try failed, do it again */\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_write( pinfo->trb_addr, pinfo->reg_addr, value );\r
- if ( -1 == trb_stat ) {\r
- /* second try failed, return error */\r
- fprintf( stderr, "\033[31;1m%s: write_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, WRITE_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
- return -1;\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-/*----- process routine of waveform records -----------------------------------*/\r
-static long processWaveform( waveformRecord* prec ) {\r
- trbnet_info_t *pinfo = (trbnet_info_t*)prec->dpvt;\r
- epicsUInt32 *pdata_buf;\r
- epicsUInt32 count = 200;//prec->nelm; // equal to 100 boards\r
- int trb_stat = 0;\r
- int i = 0;\r
-\r
- \r
- if( !_trb_connected ) {\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed TEST:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() ); // same as above\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-\r
- pdata_buf = callocMustSucceed( count, sizeof(epicsUInt32), "devTrbnet::processWaveform" );\r
- \r
- int j,k,address;\r
- int search_stat = 0 ;\r
- int trb_Nmb=0, reg_Nmb=0, field_Nmb=0;\r
-\r
- for(i=0;i<NumberOfBoards;i++){\r
- \r
- for(j=0;j<trb[i].used;j++){ \r
- if (strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf) == 0){\r
- search_stat = 0;\r
- }\r
- else {\r
- for(k=0;k<trb[i].Reg[j].used;k++){\r
- if (strcmp(trb[i].Reg[j].field[k].name, pinfo->reg_name_buf) == 0){\r
- address = trb[i].Reg[j].field[k].regAddr;\r
- search_stat = 0;\r
- trb_Nmb=i; reg_Nmb=j; field_Nmb=k; \r
- } else {\r
- search_stat = -1; \r
- }\r
- }\r
- }\r
- } \r
- }\r
- int data_size = 2;\r
- if (search_stat){\r
-\r
- //trb_stat = trb_register_readTESTFUNKTION( pinfo->trb_addr, address, pdata_buf, count );\r
-\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, pdata_buf, count );\r
- if ( -1 == trb_stat ) {\r
- /* first try failed, do it again */\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, pdata_buf, count );\r
- if ( -1 == trb_stat ) {\r
- fprintf( stderr, "\033[31;1m%s: read_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- free( pdata_buf );\r
- if (trb_errno == 12){\r
- prec->nelm = prec->nelm * 2;\r
- }\r
- recGblSetSevr( prec, READ_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
-// recGblSetSevr( prec, NULL, NULL );\r
- return -1;\r
- }\r
-\r
- if ( trb_stat != prec->nelm ) { //>\r
- /*int trb_stat_temp = trb_stat;\r
- trb_stat = prec->nelm;\r
- prec->nelm = trb_stat_temp;*/\r
- prec->nelm = trb_stat;\r
- prec->bptr = realloc(prec->bptr, prec->nelm * dbValueSize(prec->ftvl));\r
- }\r
-\r
- double *pvalue = (epicsUInt32*)prec->bptr;\r
-\r
-\r
- //---------------------------------------------------//\r
- double output = -1;\r
- epicsUInt32 start = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].start);\r
- epicsUInt32 end = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].bits);\r
- double scale = trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].scale;\r
- \r
-/* for( i=0; i < trb_stat; i+=2 ) {\r
- output = ((pdata_buf[i+1]/start)%end )*scale;\r
- pvalue[i] = pdata_buf[i];\r
- pvalue[i+1] = output;\r
- }\r
-*/\r
- for( i=0; i<( prec->nelm/2); i+=1 ){\r
- output = ((pdata_buf[(i*2)+1]/start)%end ) * scale;\r
- pvalue[i] = pdata_buf[i*2];\r
- pvalue[i+(trb_stat/2)] = output;\r
- }\r
-\r
- //---------------------------------------------------//\r
-\r
- } else {\r
- printf("No Address Name %s found!\n", pinfo->reg_name_buf);\r
- } \r
-//--------------------------------//\r
- prec->nord = trb_stat;\r
-\r
- free( pdata_buf );\r
-\r
- return 0;\r
-}\r
-\r
+++ /dev/null
-/****** I N C L U D E S *******************************************************/\r
-\r
-/* ANSI C includes */\r
-#include <stdbool.h>\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include <math.h>\r
-\r
-/* EPICS includes */\r
-#include <alarm.h>\r
-#include <cantProceed.h>\r
-#include <dbAccess.h>\r
-#include <dbFldTypes.h>\r
-#include <dbScan.h>\r
-#include <devSup.h>\r
-#include <errlog.h>\r
-#include <epicsExport.h>\r
-#include <epicsTypes.h>\r
-#include <iocLog.h>\r
-#include <iocsh.h>\r
-#include <longinRecord.h>\r
-#include <longoutRecord.h>\r
-#include <recGbl.h>\r
-#include <waveformRecord.h>\r
-\r
-/* local includes */\r
-#include "trberror.h"\r
-#include "trbnet.h"\r
-\r
-\r
-#define LINELENGTH 250\r
-\r
-#define NumberOfBoards 1\r
-\r
-#define __Name 0\r
-#define __Scale 1\r
-#define __Unit 2\r
-#define __Format 3\r
-#define __Start 4\r
-#define __Bits 5\r
-#define __Rate 6\r
-#define __ErrorFlag 7\r
-#define __InvertFlag 8\r
-#define __Value 9\r
-\r
-/****** D E F I N I T I O N S **************************************************/\r
-static long initLi( longinRecord* prec );\r
-static long initLo( longoutRecord* prec );\r
-static long initWaveform( waveformRecord* prec );\r
-static long processLi( longinRecord* prec );\r
-static long processLo( longoutRecord* prec );\r
-static long processWaveform( waveformRecord* prec );\r
-\r
-typedef struct {\r
- long number;\r
- DEVSUPFUN dev_report;\r
- DEVSUPFUN init;\r
- DEVSUPFUN init_record;\r
- DEVSUPFUN get_ioint_info;\r
- DEVSUPFUN process;\r
-} dev_dset_trbnet_t;\r
-\r
-typedef struct {\r
- epicsUInt16 trb_addr;\r
- char* reg_name_buf;\r
- char* reg_name_buf_nbr;\r
- epicsUInt16 reg_addr;\r
- //char entity_name[20];\r
-} trbnet_info_t;\r
-\r
-typedef struct{\r
- epicsUInt16 regAddr;\r
- char *name;\r
- float scale;\r
- char *unit;\r
- char *format;\r
- int start;\r
- int bits;\r
- int rate;\r
- char *errorflag;\r
- char *invertflag;\r
- int value;\r
-}field_struct;\r
-\r
-typedef struct{\r
- epicsUInt16 regAddr;\r
- char *name;\r
- char *purpose;\r
- field_struct *field;\r
- int size;\r
- int used;\r
- int value;\r
-}reg_struct;\r
-\r
-typedef struct{\r
- epicsUInt16 address;\r
- char *name;\r
- reg_struct *Reg;\r
- size_t size;\r
- size_t used;\r
-}trb_struct;\r
-\r
-/****** G L O B A L S **********************************************************/\r
-dev_dset_trbnet_t dev_trbnet_li = { 6, NULL, NULL, initLi, NULL, processLi };\r
-dev_dset_trbnet_t dev_trbnet_lo = { 6, NULL, NULL, initLo, NULL, processLo };\r
-dev_dset_trbnet_t dev_trbnet_waveform = { 6, NULL, NULL, initWaveform, NULL, processWaveform };\r
-trb_struct *trb;\r
-int databaseSet = 0;\r
-\r
-/****** L O C A L S ************************************************************/\r
-static bool _trb_connected = false;\r
-\r
-/****** F U N C T I O N S ******************************************************/\r
-\r
-epicsExportAddress( dset, dev_trbnet_li );\r
-epicsExportAddress( dset, dev_trbnet_lo );\r
-epicsExportAddress( dset, dev_trbnet_waveform );\r
-\r
-/*----- TEST FUNKTION ---------------------------------------------------------*/\r
-int trb_register_readTESTFUNKTION( uint16_t trb_addr,\r
- uint16_t addr,\r
- uint32_t *data,\r
- unsigned int dsize)\r
-{\r
- int status = 0;\r
- if (trb_addr== 0) {\r
- if (addr== 0) {\r
- data[0] = 0;\r
- //data[1]=21400000; \r
- data[1] = 557842432;\r
- }\r
- return 2;\r
- }\r
- else if(trb_addr == 1) {\r
- data[0] = 0;\r
- data[1] = 557842432;\r
- data[2] = 1;\r
- data[3] = 557845532;\r
- data[4] = 2;\r
- data[5] = 557823451;\r
- data[6] = 3;\r
- data[7] = 557733332;\r
- data[8] = 4;\r
- data[9] = 667823451;\r
- data[10] = 5;\r
- data[11] = 598733332;\r
- return 12;\r
- } else {\r
- return -1;\r
- }\r
-}\r
-\r
-int PadiwaSendCmd(uint32_t cmd, uint32_t board, uint32_t chain) {\r
- \r
- uint32_t c[] = { cmd,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1<<chain,0x10001};\r
- int i=0;\r
- //for (i=0;i<99;i++){\r
- trb_register_write_mem(board,0xd400,0,c,18);\r
-// fprintf(stderr,"ERR: %s \n",trb_strerror());\r
- usleep(100);\r
- //}\r
- uint32_t c_ret[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};\r
- int ret=0;\r
- ret = trb_register_read(board,0xd412,c_ret,18);\r
- \r
-// fprintf(stderr,"1.: %08x 2:. %08x \n",c_ret[0], c_ret[1]);\r
- \r
- return c_ret[1];\r
-}\r
-\r
-\r
-/*----- Necessary Functions for Database --------------------------------------*/\r
-\r
-void initField(trb_struct *trb, size_t RegNumb) {\r
- trb->Reg[RegNumb].field = (field_struct *)malloc(sizeof(field_struct)); // 1 field\r
- trb->Reg[RegNumb].used = 0;\r
- trb->Reg[RegNumb].size = 1;\r
- //Init with start values\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].regAddr = trb->Reg[RegNumb].regAddr;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].name = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].scale = 1;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].unit = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].format = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].start = 0;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].bits = 32;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].rate = -1;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].errorflag = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].invertflag = NULL;\r
- trb->Reg[RegNumb].field[trb->Reg[RegNumb].used].value = -1;\r
-}\r
-\r
-void initReg(trb_struct *trb, size_t initialSize) {\r
- trb->Reg = (reg_struct *)malloc(initialSize * sizeof(reg_struct));\r
- trb->used = 0;\r
- trb->size = initialSize;\r
- int i=0;\r
- for ( i; i < initialSize; i++) {\r
- initField(trb, i); // trb_struct; i01= Element of Register\r
- }\r
-}\r
-\r
-// Insert a new field. Only RegAddress is Set from default\r
-void insertField(reg_struct *reg) {\r
- if (reg->used == reg->size) {\r
- reg->size++;\r
- reg->field = (field_struct *)realloc(reg->field, reg->size * sizeof(field_struct));\r
- }\r
- //Init with start values\r
- reg->field[reg->used].regAddr = reg->regAddr; //set register Address\r
- reg->field[reg->used].name = NULL;\r
- reg->field[reg->used].scale = 1;\r
- reg->field[reg->used].unit = NULL;\r
- reg->field[reg->used].format = NULL;\r
- reg->field[reg->used].start = 0;\r
- reg->field[reg->used].bits = 32;\r
- reg->field[reg->used].rate = -1;\r
- reg->field[reg->used].errorflag = NULL;\r
- reg->field[reg->used].invertflag = NULL;\r
- reg->field[reg->used].value = -1;\r
- reg->used++;\r
-}\r
-\r
-int setFieldPropertyInt(reg_struct *reg,int fieldNmb, int element, int data) {\r
- if (fieldNmb < reg->used) {\r
- if (element == __Start){ //field start\r
- reg->field[fieldNmb].start = data;\r
- } else if (element == __Bits){ //field bits\r
- reg->field[fieldNmb].bits = data;\r
- } else if (element == __Rate){ //field rate\r
- reg->field[fieldNmb].rate = data;\r
- } else if (element == __Value){ //field ratevalue\r
- reg->field[fieldNmb].value = data;\r
- } else {\r
- printf("Element does not Fit to a INT Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error\r
- }\r
-}\r
-\r
-int setFieldPropertyStr(reg_struct *reg,int fieldNmb, int element, char *data) {\r
- if (fieldNmb < reg->used) {\r
- if(element == __Name){ //field NAME\r
- reg->field[fieldNmb].name =strdup(data);\r
- } else if (element == __Unit){ //field UNIT\r
- reg->field[fieldNmb].unit = strdup(data);\r
- } else if (element == __Format){ //field format\r
- reg->field[fieldNmb].format = strdup(data);\r
- } else if (element == __ErrorFlag){ //field errorflag\r
- reg->field[fieldNmb].errorflag = strdup(data);\r
- } else if (element == __InvertFlag){//field invertflag\r
- reg->field[fieldNmb].invertflag = strdup(data);\r
- } else {\r
- printf("Element does not Fit to a STRING Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error; Field does not exist\r
- }\r
-}\r
-\r
-int setFieldPropertyFloat(reg_struct *reg, int fieldNmb, int element, float data) {\r
- if (fieldNmb < reg->used) {\r
- if (element == __Scale){ //field SCALE\r
- reg->field[fieldNmb].scale = data;\r
- } else {\r
- printf("Element does not Fit to a FLOAT Type property.\n");\r
- }\r
- return 0;\r
- } else {\r
- return 1; //Error; Field does not exist\r
- }\r
-}\r
-\r
-void insertReg(trb_struct *trb, int element) {\r
- if (trb->used == trb->size) {\r
- trb->size++;\r
- trb->Reg = (reg_struct *)realloc(trb->Reg, trb->size * sizeof(reg_struct));\r
- }\r
- trb->Reg[trb->used].regAddr = element;\r
- initField(trb, trb->used);\r
- trb->used++;\r
-}\r
-\r
-// free the allocated memory of the fields of each Register\r
-void freeField(trb_struct *trb) {\r
- int i=0;\r
- for (i;i<trb->used;i++){\r
- free(trb->Reg[i].field);\r
- trb->Reg[i].field = NULL;\r
- trb->Reg[i].used = trb->Reg[i].size = 0;\r
- }\r
-}\r
-\r
-// free the allocated memory of each register\r
-void freeReg(trb_struct *trb) {\r
- freeField(trb);\r
- free(trb->Reg);\r
- trb->Reg = NULL;\r
- trb->used = trb->size = 0;\r
-}\r
-\r
-/*----- Common initialization for all records ---------------------------------*/\r
-\r
-static long initCommon( dbCommon* prec, DBLINK* plink ) {\r
-\r
- trbnet_info_t *pinfo;\r
- char entity_name_buf[20] = "";\r
- char Reg_name_buf[20] = "";\r
- epicsUInt32 trb_addr_buf = 0;\r
- epicsUInt32 reg_addr_buf = 0;\r
- \r
- char linebuffer[LINELENGTH];\r
-\r
- if ( sscanf( plink->value.instio.string, "%s %x %s", entity_name_buf, &trb_addr_buf, Reg_name_buf ) != 3 ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid value of INP/OUT field '%s'\033[0m\n",\r
- prec->name, plink->value.instio.string );\r
- return -1;\r
- }\r
- if ( 0xffff < trb_addr_buf ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid trb address '%x'\033[0m\n",\r
- prec->name, trb_addr_buf );\r
- return -1;\r
- }\r
-\r
- pinfo = callocMustSucceed( 1, sizeof(*pinfo), "devTrbnet::initCommon" );\r
- pinfo->trb_addr = (epicsUInt16)( trb_addr_buf & 0xffff );\r
-// pinfo->reg_name_buf = strdup(Reg_name_buf);\r
- prec->dpvt = pinfo;\r
- prec->udf = FALSE;\r
- int i=0;\r
-\r
- // check special cases that are not inb XMLS Database\r
- char * pname;\r
-// char reg_name_buf[30];\r
-// strcpy(reg_name_buf, pinfo->reg_name_buf);\r
- pname = strtok(Reg_name_buf,"_");\r
- pinfo->reg_name_buf = strdup(pname);\r
-\r
- while (pname != NULL){\r
-// printf("Ausgabe: %s\n",pname);\r
- pinfo->reg_name_buf_nbr = strdup(pname);\r
- pname = strtok(NULL," ");\r
- \r
- }\r
-printf("test: %s\n",pinfo->reg_name_buf);\r
-printf("test2: %s\n",pinfo->reg_name_buf_nbr);\r
-//----------------------------------------------------------------//\r
- \r
- \r
-\r
-// create Memory for each TrbBoard\r
- if (databaseSet==0)\r
- { \r
- trb = (trb_struct *) malloc(NumberOfBoards * sizeof(trb_struct));\r
-\r
- for(i=0;i<NumberOfBoards;i++){\r
- initReg(&trb[i], 1); // initially 2 Registers in first Trb; also inits first field\r
- }\r
- \r
- //read the entity-file from cache\r
- int gaddress=-1;\r
- int raddress=-1,bits=0,start=0,rate=0,unit=0;\r
- float scale=0.;\r
- bool register_open=false,field_open=false,group_open=false;\r
- char node[20]="",gname[25]="",gmode[2]="",rname[25]="",purpose[25]="",fname[20]="",fformat[10]="";\r
- int trb_status; \r
- char* filepath = {"/home/pi/daqtools/xml-db/database/"};\r
- char* name = {"TrbNet"};\r
- char filename[strlen(filepath)+strlen(entity_name_buf)+5];\r
- snprintf( filename , sizeof( filename ), "%s%s.xml", filepath, entity_name_buf );\r
- FILE *fp;\r
- fp = fopen( filename , "r");\r
- //get each line of document\r
- while(fgets(linebuffer, LINELENGTH, fp)){\r
- char delimiter[] = " ";\r
- char *ptr;\r
- ptr = strtok(linebuffer, delimiter);\r
- sscanf(ptr, "%s", node); \r
- ptr = strtok(NULL, delimiter);\r
-\r
- if (strcmp(node,"<group") == 0){\r
- group_open = true;\r
- }\r
- if (strcmp(node,"</group>") == 0){\r
- group_open = false;\r
- }\r
- if (strcmp(node,"<register") == 0){\r
- for (i=0; i < NumberOfBoards; i++){\r
- insertReg(&trb[i], 0);\r
- }\r
- register_open = true;\r
- }\r
- if (strcmp(node,"</register>") == 0){\r
- register_open = false;\r
- }\r
- if (strcmp(node,"<field") == 0){\r
- for (i=0; i < NumberOfBoards; i++){\r
- insertField(&trb[i].Reg[trb[i].used-1]);\r
- }\r
- field_open = true;\r
- }\r
- if (strcmp(node,"</field>") == 0){\r
- field_open = false;\r
- }\r
- \r
- // analyse each part of one line of .xml document\r
- while(ptr != NULL) {\r
- \r
- if (group_open==true && register_open==false && field_open==false) {\r
- sscanf(ptr, "address=\"%x\"", &gaddress);\r
- sscanf(ptr, "name=\"%[A-z,_0-9]\"", gname);\r
- sscanf(ptr, "mode=\"%[A-z,_,0-9]\"", gmode);\r
- } \r
- if (register_open==true && group_open==true && field_open==false){\r
- if(sscanf(ptr, "address=\"%x\"", ®_addr_buf)==1){\r
- pinfo->reg_addr = (epicsUInt16)( (reg_addr_buf + gaddress) & 0xffff );\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].regAddr = pinfo->reg_addr;\r
- }\r
- }\r
- if(sscanf(ptr, "name=\"%[A-z,_0-9]\"", rname)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].name = strdup(rname);\r
- }\r
- }\r
-\r
- if(sscanf(ptr, "purpose=\"%[A-z,_0-9]\"", purpose)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].purpose = strdup(purpose);\r
- }\r
- }\r
- }\r
-\r
- if (field_open==true && group_open==true && register_open==true){\r
- if (strcmp(ptr,"/>\n") == 0){\r
- field_open=false;\r
- }\r
- if (sscanf(ptr, "name=\"%[A-z,_0-9]\"", fname)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].name = strdup(fname);\r
- }\r
- }\r
- if (sscanf(ptr, "format=\"%[A-z,_0-9]\"", fformat)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].format = strdup(fformat);\r
- }\r
- }\r
- if (sscanf(ptr, "bits=%*c%i%*c", &bits)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].bits = bits;\r
- }\r
- }\r
- if (sscanf(ptr, "start=%*c%i%*c", &start)==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].start = start;\r
- }\r
- }\r
- if (sscanf(ptr, "rate=%*c%i%*c", &rate )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].rate = rate;\r
- }\r
- }\r
- if (sscanf(ptr, "unit=%*c%x%*c", &unit )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].unit = unit;\r
- }\r
- }\r
- if (sscanf(ptr, "scale=%*c%f%*c", &scale )==1){\r
- for (i=0; i < NumberOfBoards; i++){\r
- trb[i].Reg[trb[i].used-1].field[trb[i].Reg[trb[i].used-1].used-1].scale = scale;\r
- }\r
- }\r
- }\r
-\r
- ptr = strtok(NULL, delimiter);\r
- }//end while2\r
- }//end while1\r
-\r
- fclose(fp);\r
- databaseSet = 1;\r
- } \r
- if ( 0xffff < reg_addr_buf ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid register address '%x'\033[0m\n",prec->name, reg_addr_buf );\r
- return -1;\r
- }\r
-\r
-//----------------------------------------------------------------------//\r
-\r
-/* // Test the fields\r
- printf("Register Addres: %i\n", trb[0].Reg[8].regAddr); // getAddr of Register[0]\r
- printf("Number of registers: %i\n", trb[0].size); // print number of fields in Register\r
- printf("Number of fields:%i\n", trb[0].Reg[0].size); // print name of field 1 in Register 0\r
- printf("Number of fields:%s\n", trb[0].Reg[1].field[0].name); // print name of field 1 in Register 0\r
- printf("%i\n", trb[0].used); // getAddr of Register[0]\r
-*/\r
-//---------------------------------------------------------------------------------------------//\r
- /*free memory\r
- for(i=0;i<NumberOfBoards;i++){\r
- freeReg(&trb[i]);\r
- }\r
-\r
- free(trb);\r
- */\r
-//-------------------------------------------------------------------------------------------//\r
- return 0;\r
-}\r
-\r
-/*----- initialization of longin records --------------------------------------*/\r
-static long initLi( longinRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->inp );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- initialization of longout records -------------------------------------*/\r
-static long initLo( longoutRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->out );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- initialization of waveform records ------------------------------------*/\r
-static long initWaveform( waveformRecord* prec ) {\r
- long status = 0;\r
- prec->pact = (epicsUInt8)true; /* disable record */\r
-\r
- if ( DBF_DOUBLE != prec->ftvl ) {\r
- fprintf( stderr, "\033[31;1m%s: Invalid field type of value\033[0m\n", prec->name );\r
- return -1;\r
- }\r
-\r
- status = initCommon( (dbCommon *)prec, &prec->inp );\r
- prec->pact = (epicsUInt8)false; /* enable record */\r
-\r
- return status;\r
-}\r
-\r
-/*----- process routine of longin records -------------------------------------*/\r
-static long processLi( longinRecord* prec ) {\r
- trbnet_info_t* pinfo = (trbnet_info_t*)prec->dpvt;\r
- epicsUInt32 data[2] = { 0 };\r
- int trb_stat = 0;\r
-\r
- int j,k,i,address;\r
- int search_stat = 0 ;\r
- int trb_Nmb=0, reg_Nmb=0, field_Nmb=0;\r
-\r
- if( !_trb_connected ){\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() ); // could be a problem (prec->name)\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-\r
-\r
-\r
- // READ Address from Database\r
- for(i=0;i<NumberOfBoards;i++){\r
-\r
- for(j=0;j<trb[i].used;j++){\r
- if (strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf) == 0){\r
- search_stat = 0;\r
- }\r
- else {\r
- for(k=0;k<trb[i].Reg[j].used;k++){\r
-\r
- if (strcmp(trb[i].Reg[j].field[k].name, pinfo->reg_name_buf) == 0){\r
- address = trb[i].Reg[j].field[k].regAddr;\r
- search_stat = 0;\r
- trb_Nmb=i; reg_Nmb=j; field_Nmb=k;\r
- } else {\r
- search_stat = -1;\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
- if (search_stat){\r
- int data_size = 2;\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, data, data_size );\r
- //trb_stat = trb_register_readTESTFUNKTION( pinfo->trb_addr, address, data, data_size );\r
- \r
- //--------------------------------------//\r
- if ( -1 == trb_stat ) {\r
- /* first try failed, do it again */\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, data, data_size );\r
- if ( -1 == trb_stat ) {\r
- /* second try failed, return error */\r
- fprintf( stderr, "\033[31;1m%s: read_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, READ_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- /* Check Status-Bits */\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
- recGblSetSevr( prec, NULL, NULL);\r
- return -1;\r
- }\r
- //------------------------------// \r
- double output = -1;\r
- epicsUInt32 start = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].start);\r
- epicsUInt32 end = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].bits);\r
- double scale = trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].scale;\r
-\r
- for (i=0; i< data_size;i+=2){\r
- output = ((data[i+1]/start)%end )*scale;\r
- prec->val = output;\r
- }\r
- //--------------------------------//\r
-\r
- } else {\r
- printf("No Address Name %s found!\n", pinfo->reg_name_buf);\r
- } \r
-\r
-\r
- return 0;\r
-}\r
-\r
-//----- LONGOUT IS NOT IN USE!!!-----------------------------------------------//\r
-/*----- process routine of longout records ------------------------------------*/\r
-static long processLo( longoutRecord* prec ) {\r
- trbnet_info_t* pinfo = (trbnet_info_t*)prec->dpvt;\r
- epicsUInt32 value = prec->val;\r
- int trb_stat = 0;\r
-\r
- if( !_trb_connected ) {\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-\r
- trb_stat = trb_register_write( pinfo->trb_addr, pinfo->reg_addr, value );\r
- if ( -1 == trb_stat ) {\r
- /* first try failed, do it again */\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_write( pinfo->trb_addr, pinfo->reg_addr, value );\r
- if ( -1 == trb_stat ) {\r
- /* second try failed, return error */\r
- fprintf( stderr, "\033[31;1m%s: write_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, WRITE_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
- return -1;\r
- }\r
-\r
- return 0;\r
-}\r
-\r
-/*----- process routine of waveform records -----------------------------------*/\r
-static long processWaveform( waveformRecord* prec ) {\r
- trbnet_info_t *pinfo = (trbnet_info_t*)prec->dpvt;\r
- epicsUInt32 *pdata_buf;\r
- epicsUInt32 count = 200;//prec->nelm; // equal to 100 boards\r
- int trb_stat = 0;\r
- int i = 0;\r
-\r
- \r
-/* if( !_trb_connected ) {\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed TEST:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() ); // same as above\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- _trb_connected = true;\r
- }\r
-*/\r
- pdata_buf = callocMustSucceed( count, sizeof(epicsUInt32), "devTrbnet::processWaveform" );\r
- \r
- int j,k,address;\r
- int search_stat = -1 ;\r
- int trb_Nmb=0, reg_Nmb=0, field_Nmb=0;\r
-\r
- if (strcmp(pinfo->reg_name_buf, "ADC") == 0){\r
- search_stat = 1;\r
-} else {\r
-\r
- for(i=0;i<NumberOfBoards;i++){\r
- \r
- for(j=0;j<trb[i].used;j++){ \r
- \r
- if (search_stat >= 0){\r
- //run without doing smtng\r
- } else {\r
- if (strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf) == 0){\r
- search_stat = 0;\r
- }\r
- else {\r
- for(k=0;k<trb[i].Reg[j].used;k++){\r
- //printf("Test: %i\n",strcmp(trb[i].Reg[j].field[k].name, pinfo->reg_name_buf));\r
-\r
- if (strcmp(trb[i].Reg[j].field[k].name, pinfo->reg_name_buf) == 0){\r
- address = trb[i].Reg[j].field[k].regAddr;\r
- search_stat = 0;\r
- trb_Nmb=i; reg_Nmb=j; field_Nmb=k;\r
- } else {\r
- search_stat = -1;\r
- }\r
- }\r
- }\r
- }//search_stat end if\r
- } \r
- }\r
-\r
-}\r
-\r
- int data_size = 2;\r
- unsigned int mode = 0;\r
-\r
- if (search_stat == 1){\r
- int channel[5] = {7,7,7,6,5};\r
- int resolution[5][4] = {{2,1,2,1},{2,2,2,1},{2,2,2,4},{2,2,2,2},{3,3,2,2}};\r
- double multiplier[5][4] = {{1.,1.,0.5,2.},{1.,1.,0.5,0.},{1.,1.,0.5,3.125},{1.,1.,0.5,0.5},{2.5,1.25,1.,0.5}};\r
- int cmd = 0;\r
-\r
- if (atoi(pinfo->reg_name_buf_nbr)>=0 && atoi(pinfo->reg_name_buf_nbr)<5) {\r
- mode = atoi(pinfo->reg_name_buf_nbr);\r
- } else {\r
- mode = 0;\r
- }\r
-fprintf(stderr,"TEST PLlace\n");\r
- //prec->nelm = 10;\r
- //prec->bptr = realloc(prec->bptr, prec->nelm * dbValueSize(prec->ftvl));\r
-\r
- double *pvalue = (epicsUInt32*)prec->bptr;\r
-\r
- pvalue[0] = 3;\r
- pvalue[1] = 5;\r
- pvalue[2] = 4;\r
- pvalue[3] = 1;\r
-\r
-\r
-/* double output = -1;\r
- for( i=0; i<( prec->nelm/2); i+=1 ){\r
- output = 2.;//((pdata_buf[(i*2)+1]/start)%end ) * scale;\r
- pvalue[i] = 5.;//pdata_buf[i*2];\r
- pvalue[prec->nelm/2 + i] = output;\r
- }\r
-*/\r
-\r
- cmd = 0xc1830000 + ( resolution[mode][0] << 25);\r
-/* trb_register_write(0x8300,pinfo->trb_addr,25);\r
- PadiwaSendCmd(cmd,pinfo->trb_addr,channel[mode]);\r
- usleep(5000);\r
- cmd = 0xd1830000 + ( resolution[mode][1] << 25);\r
- fprintf(stderr," 1: %f \n",(double) ((( PadiwaSendCmd(cmd,pinfo->trb_addr,channel[mode])>>19)&0xfff)*multiplier[mode][0]));\r
- usleep(5000);\r
- cmd = 0xe1830000 + ( resolution[mode][2] << 25);\r
- fprintf(stderr," 2: %f \n",(double) ((( PadiwaSendCmd(cmd,pinfo->trb_addr,channel[mode])>>19)&0xfff)*multiplier[mode][1]) );\r
- usleep(1000);\r
- cmd = 0xf1830000 + ( resolution[mode][3] << 25);\r
- fprintf(stderr," 3: %f \n",(double) ((( PadiwaSendCmd(cmd,pinfo->trb_addr,channel[mode])>>19)&0xfff)*multiplier[mode][2]) );\r
- usleep(5000);\r
- fprintf(stderr," 4: %f \n",(double) (((PadiwaSendCmd(0xf3930000,pinfo->trb_addr,channel[mode])>>19)&0xfff)*multiplier[mode][3]) );\r
- usleep(5000);\r
- fprintf(stderr," 5: %3.2f \n", (double) (((PadiwaSendCmd(0,pinfo->trb_addr,channel[mode])>>19)&0xfff)/16.));\r
-\r
- trb_register_write(pinfo->trb_addr,0xd41a,7);\r
-*/\r
- } else if (search_stat == 0) {\r
- /* trb_stat = trb_register_read( pinfo->trb_addr, address, pdata_buf, count );\r
- if ( -1 == trb_stat ) {\r
- if( init_ports() == -1 ) {\r
- fprintf( stderr, "\033[31;1m%s: init_ports failed:\n%d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- recGblSetSevr( prec, COMM_ALARM, INVALID_ALARM );\r
- return -1;\r
- }\r
- trb_stat = trb_register_read( pinfo->trb_addr, address, pdata_buf, count );\r
- if ( -1 == trb_stat ) {\r
- fprintf( stderr, "\033[31;1m%s: read_register failed: %d %s\033[0m\n",\r
- prec->name, trb_errno, trb_strerror() );\r
- free( pdata_buf );\r
- if (trb_errno == 12){\r
- prec->nelm = prec->nelm * 2;\r
- }\r
- recGblSetSevr( prec, READ_ALARM, INVALID_ALARM );\r
- _trb_connected = false;\r
- return -1;\r
- }\r
- }\r
- if ( TRB_STATUS_WARNING == trb_errno ) {\r
- fprintf( stderr, "%s: Warning: Status-Bit(s) have been set:\n%s\n",\r
- prec->name, trb_termstr( trb_term ) );\r
-// recGblSetSevr( prec, NULL, NULL );\r
- return -1;\r
- }\r
-*/\r
-fprintf(stderr,"PREC: %d",prec->nelm);\r
-//trb_stat=10;//pdata_buf[0]=2;\r
-// if ( trb_stat != prec->nelm ) { //>\r
-// prec->nelm = trb_stat;\r
- prec->bptr = realloc(prec->bptr, prec->nelm * dbValueSize(prec->ftvl));\r
-// }\r
-\r
- double *pvalue = (epicsUInt32*)prec->bptr;\r
-\r
-\r
- //---------------------------------------------------//\r
- double output = -1;\r
- epicsUInt32 start = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].start);\r
- epicsUInt32 end = pow(2, trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].bits);\r
- double scale = trb[trb_Nmb].Reg[reg_Nmb].field[field_Nmb].scale;\r
- \r
-/* for( i=0; i < trb_stat; i+=2 ) {\r
- output = ((pdata_buf[i+1]/start)%end )*scale;\r
- pvalue[i] = pdata_buf[i];\r
- pvalue[i+1] = output;\r
- }\r
-*/\r
- for( i=0; i<( prec->nelm); i+=1 ){\r
-// output = ((pdata_buf[(i*2)+1]/start)%end ) * scale;\r
- pvalue[i] = 3.34;//pdata_buf[i];\r
-// pvalue[i+(trb_stat/2)] = pdata_buf[i+];//output;\r
- }\r
-\r
- //---------------------------------------------------//\r
-\r
- } else {\r
- printf("No Address Name %s found!\n", pinfo->reg_name_buf);\r
- } \r
-//--------------------------------//\r
- prec->nord = 10;//trb_stat;\r
-\r
- free( pdata_buf );\r
-\r
- return 0;\r
-}\r
-\r