]> jspc29.x-matter.uni-frankfurt.de Git - epics.git/commitdiff
devTrbNet buxfixe for XML Format (now working with MDC.xml)
authorAdrian Weber <Adrian.a.Weber@exp2.physik.uni-giessen.de>
Fri, 20 Apr 2018 09:43:42 +0000 (11:43 +0200)
committerAdrian Weber <Adrian.a.Weber@exp2.physik.uni-giessen.de>
Fri, 20 Apr 2018 09:43:42 +0000 (11:43 +0200)
Trbnet/devTrbnet/TrbnetApp/Db/trbExample.substitutions
Trbnet/devTrbnet/TrbnetApp/Db/trbExample.template
Trbnet/devTrbnet/TrbnetApp/Db/trbExample_copy.substitutions_copy [new file with mode: 0644]
Trbnet/devTrbnet/TrbnetApp/src/devTrbnet.c
Trbnet/devTrbnet/TrbnetApp/src/devTrbnet.c_backup [new file with mode: 0644]
Trbnet/devTrbnet/TrbnetApp/src/devTrbnet2.c [new file with mode: 0644]
Trbnet/devTrbnet/TrbnetApp/src/devTrbnet3.c [new file with mode: 0644]
Trbnet/devTrbnet/TrbnetApp/src/devTrbnet_save.c [new file with mode: 0644]
Trbnet/devTrbnet/TrbnetApp/src/devTrbnet_test.c [new file with mode: 0644]
Trbnet/devTrbnet/iocBoot/iocTrbnet/st.cmd

index 216963d7b8d75cb743787a7a5ec0283230a7fc3d..4c03ac8376e12f9addbe130e2e89a51e7c5f36dd 100644 (file)
@@ -1,3 +1,12 @@
 file TrbnetApp/Db/trbExample.template {
-  {P=HAD:RICH:, TRBADDR=0x2220, REGADDR="3V8", TRBADDRWave=0x2220}
+  {P=HAD:MDC:TrbNet:,M="", TRBADDR=0xfffd, REGADDR="5V8", TRBADDRWave=0xfffd}
+  {P=HAD:MDC:TrbNet:,M="", TRBADDR=0xfffd, REGADDR="5V",  TRBADDRWave=0xfffd}
+  {P=HAD:MDC:TrbNet:,M="", TRBADDR=0xfffd, REGADDR="3V8", TRBADDRWave=0xfffd}
+  {P=HAD:MDC:TrbNet:,M="", TRBADDR=0xfffd, REGADDR="3V3", TRBADDRWave=0xfffd}
+  {P=HAD:MDC:TrbNet:,M="", TRBADDR=0xfffd, REGADDR="1V8", TRBADDRWave=0xfffd}
+  {P=HAD:MDC:TrbNet:,M="", TRBADDR=0xfffd, REGADDR="1V2", TRBADDRWave=0xfffd}
+  {P=HAD:MDC:TrbNet:,M="", TRBADDR=0xfffd, REGADDR="p3V", TRBADDRWave=0xfffd}
+  {P=HAD:MDC:TrbNet:,M="", TRBADDR=0xfffd, REGADDR="m3V", TRBADDRWave=0xfffd}
 }
+
+# M is Moduel. e.g. "DIRICH:"
\ No newline at end of file
index bc57368820a79e11c49b16b0123ca10006754346..71d4b2a207c6efc13dc83d30feedc49b5a46064d 100644 (file)
 #}
  
 
-#record (waveform,"$(P)DiRICH:$(TRBADDRWave):READREGISTER:$(REGADDR)")
-record (waveform,"$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR)")
+#record (waveform,"$(P)$(M)$(TRBADDRWave):READREGISTER:$(REGADDR)")
+record (waveform,"$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR)")
 {
   field( DESC, "Waveform of DiRich Temperatures.")
   field( SCAN , "5 second")
   field( DTYP, "devTrbnet" )
   field( INP,  "@TrbNet $(TRBADDRWave) $(REGADDR)" )
-  field( NELM, "200")
+  field( NELM, "1000")
   field( FTVL, "DOUBLE")
-  field( FLNK, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR):Calc_")
+  field( FLNK, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR):Calc_")
 }
 
-record(calcout, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR):Calc_")
+record(calcout, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR):Calc_")
 {
-  field(INPA, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR).NELM")
+  field(INPA, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR).NELM")
   field(CALC, "A/2")
-  field(OUT, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR):Testfan_.VAL PP")
-  #field(FLNK, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR):Testfan_.PROC")
+  field(OUT, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR):Testfan_.VAL PP")
+  #field(FLNK, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR):Testfan_.PROC")
 
 }
 
-record(dfanout, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR):Testfan_")
+record(dfanout, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR):Testfan_")
 {
-  field(OUTA, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR):SubArray.NELM PP")
-  field(OUTB, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR):SubArray2.INDX")
-  field(OUTC, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR):SubArray2.NELM PP")
-  #field(FLNK, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR):SubArray.PROC")
+  field(OUTA, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR):SubArray.NELM PP")
+  field(OUTB, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR):SubArray2.INDX")
+  field(OUTC, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR):SubArray2.NELM PP")
+  #field(FLNK, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR):SubArray.PROC")
 }
 
-record(subArray, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR):SubArray")
+record(subArray, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR):SubArray")
 {
   field(DESC, "lower half")
   field(DTYP, "Soft Channel")
   field(MALM, "1024")
   field(INDX, "0")
   field(FTVL, "DOUBLE")
-  field(INP, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR).VAL")
+  field(INP, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR).VAL")
 }
 
-record(subArray, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR):SubArray2")
+record(subArray, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR):SubArray2")
 {
   field(DESC, "Upper half")
   field(DTYP, "Soft Channel")
-  field(INP, "$(P)DiRICH:$(TRBADDRWave):RREG:$(REGADDR)")
+  field(INP, "$(P)$(M)$(TRBADDRWave):RREG:$(REGADDR)")
   field(FTVL, "DOUBLE")
   field(MALM, "1024")
 }
diff --git a/Trbnet/devTrbnet/TrbnetApp/Db/trbExample_copy.substitutions_copy b/Trbnet/devTrbnet/TrbnetApp/Db/trbExample_copy.substitutions_copy
new file mode 100644 (file)
index 0000000..a02dc5a
--- /dev/null
@@ -0,0 +1,16 @@
+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}
+}
index 9609ddd3ab59e4513e77d8be7f2b1d1d94df8df0..47567e90fedf349ee4441863c5cf0f7bb68d8767 100644 (file)
@@ -361,11 +361,12 @@ static long initCommon( dbCommon* prec, DBLINK* plink ) {
     }\r
     \r
     //read the entity-file from cache\r
-    int gaddress=-1;\r
+    int gaddress = -1;\r
+    int Entity_addr = -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
+    bool register_open=false,field_open=false,group_open=false,Entity_open=false;\r
+    char node[20]="",gname[25]="",gmode[2]="",rname[25]="",purpose[25]="",fname[20]="",fformat[10]="", Entity_name[25]="";\r
     int trb_status; \r
     char* filepath = getenv("EPICS_TRBNET_XML_PATH");\r
     //char* name = {"TrbNet"};\r
@@ -384,9 +385,26 @@ static long initCommon( dbCommon* prec, DBLINK* plink ) {
       char delimiter[] = " ";\r
       char *ptr;\r
       ptr = strtok(linebuffer, delimiter);\r
-      sscanf(ptr, "%s", node); \r
-      ptr = strtok(NULL, delimiter);\r
 \r
+      sscanf(ptr, "%s", node);\r
+      //printf("%s \n", node);\r
+      ptr = strtok(NULL, delimiter);\r
+       if (strcmp(node,"<TrbNetEntity") == 0){\r
+           Entity_open = true;\r
+           //printf("Entity_Open\n");\r
+        }\r
+        \r
+     \r
+        if (Entity_open == true) {\r
+            sscanf(node, "address=\"%x\"", &Entity_addr);\r
+           sscanf(node, "name=\"%[A-z,_0-9]\" ",  Entity_name);\r
+       }\r
+       \r
+       if (Entity_open == true && strcmp(node,">") == 0){\r
+           Entity_open = false;\r
+           //printf("Entity_Close\n");\r
+        }\r
+        \r
        if (strcmp(node,"<group") == 0){\r
            group_open = true;\r
         }\r
@@ -414,81 +432,92 @@ static long initCommon( dbCommon* prec, DBLINK* plink ) {
 \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\"", &reg_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
-                 printf("RNAME: %s\n", 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
-                 printf("     FNAME: %s   %i\n", rname,NumberOfBoards);\r
-\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
+       //} else {\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\"", &reg_addr_buf)==1){\r
+                 pinfo->reg_addr = (epicsUInt16)( (reg_addr_buf + gaddress + Entity_addr) & 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
+                   //printf("RNAME: %s\n", 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
+             int len = strlen(ptr);\r
+             const char *last_three = &ptr[len-3];\r
+             //printf("%s\n", last_three);\r
+             if (strcmp(ptr,"/>\n") == 0){\r
+                 field_open=false;\r
+             }\r
+             \r
+             if (strcmp(last_three,"/>\n") == 0){\r
+                 field_open=false;\r
+             }\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
+                   //printf("     FNAME: %s   %i\n", rname,NumberOfBoards);\r
+\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
 \r
         ptr = strtok(NULL, delimiter);\r
       }//end while2\r
     }//end while1\r
 \r
+//printf("Entity_address: %i\n", Entity_addr);\r
+//printf("Entity_Name %s \n",Entity_name);\r
 \r
    fclose(fp);\r
    databaseSet = 1;\r
@@ -497,16 +526,16 @@ static long initCommon( dbCommon* prec, DBLINK* plink ) {
       fprintf( stderr, "\033[31;1m%s: Invalid register address '%x'\033[0m\n",prec->name, reg_addr_buf );\r
       return -1;\r
     }\r
-printf("%i\n",__LINE__);\r
+//printf("%i\n",__LINE__);\r
 //----------------------------------------------------------------------//\r
 \r
-    // Test the fields\r
-       printf("Register Addres: %i\n", trb[0].Reg[2].regAddr);  // getAddr of Register[0]\r
+/*    // Test the fields\r
+       printf("Register Addres: 0x%4x\n", trb[0].Reg[2].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[1].size);  // print name of field 1 in Register 0\r
        printf("Number of fields:%s\n", trb[0].Reg[2].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
 //---------------------------------------------------------------------------------------------//\r
        /*free memory\r
        for(i=0;i<NumberOfBoards;i++){\r
@@ -516,7 +545,7 @@ printf("%i\n",__LINE__);
        free(trb);\r
        */\r
 //-------------------------------------------------------------------------------------------//\r
-printf("%i\n",__LINE__);\r
+//printf("%i\n",__LINE__);\r
   return 0;\r
 }\r
 \r
@@ -700,13 +729,13 @@ static long processLo( longoutRecord* prec ) {
 \r
 /*----- process routine of waveform records -----------------------------------*/\r
 static long processWaveform( waveformRecord* prec ) {\r
-  printf("%i\n",__LINE__);\r
+  //printf("%i\n",__LINE__);\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
+  epicsUInt32 count = 2000;//prec->nelm;   // equal to 100 boards\r
   int trb_stat = 0;\r
   int i = 0;\r
-printf("%i\n",__LINE__);\r
+\r
   \r
   if( !_trb_connected ) {\r
     if( init_ports() == -1 ) {\r
@@ -717,9 +746,9 @@ printf("%i\n",__LINE__);
     }\r
     _trb_connected = true;\r
   }\r
- printf("%i\n",__LINE__);\r
+;\r
   pdata_buf = callocMustSucceed( count, sizeof(epicsUInt32), "devTrbnet::processWaveform" );\r
-  printf("%i\n",__LINE__);\r
+\r
         int j,k,address;\r
        int search_stat = -1 ;\r
        int trb_Nmb=0, reg_Nmb=0, field_Nmb=0;\r
@@ -727,41 +756,47 @@ printf("%i\n",__LINE__);
       if (strcmp(pinfo->reg_name_buf, "ADC") == 0){\r
                search_stat = 1;\r
 } else {\r
-printf("%i\n",__LINE__);\r
+\r
        for(i=0;i<NumberOfBoards;i++){\r
             \r
             for(j=0;j<trb[i].used;j++){           \r
-               printf("%i  %i   %i\n",i,j,__LINE__);\r
-               if (search_stat >= 0){ printf("%i\n",__LINE__);\r
+               //printf("%i  %i   %i\n",i,j,__LINE__);\r
+               if (search_stat >= 0){ //printf("%i\n",__LINE__);\r
                //run without doing smtng\r
                } else {\r
-                 printf("%i  %i   %i\n",i,j,__LINE__);\r
-                 printf("trb %s \n",trb[i].Reg[j].name);\r
-                 printf("pinfo %s \n",pinfo->reg_name_buf);\r
-                 printf("comp  %i \n",strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf));\r
-               if (strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf) == 0){\r
-                       search_stat = 0; printf("%i  %i   %i\n",i,j,__LINE__);\r
-               }\r
-               else {\r
-                 printf("%i\n",__LINE__);\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
+               /*printf("%i  %i   %i\n",i,j,__LINE__);\r
+               printf("trb %s \n",trb[i].Reg[j].name);\r
+               printf("pinfo %s \n",pinfo->reg_name_buf);\r
+               printf("comp  %i \n",strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf));\r
+                 */\r
+                 if (strcmp(trb[i].Reg[j].name,pinfo->reg_name_buf) == 0){\r
+                         search_stat = 0; \r
+                         //printf("%i  %i   %i\n",i,j,__LINE__);\r
+                         //printf("NAME: %s \n",trb[i].Reg[j].name);\r
+                         //printf("ADDR: 0x%4x \n",trb[i].Reg[j].regAddr);\r
+                         address = trb[i].Reg[j].regAddr;\r
+                         \r
+                         trb_Nmb=i; reg_Nmb=j;\r
+                 }\r
+                 else {\r
+                   //printf("%i\n",__LINE__);\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
-printf("%i\n",__LINE__);\r
+//printf("%i\n",__LINE__);\r
         int data_size = 2;\r
        unsigned int mode = 0;\r
 \r
diff --git a/Trbnet/devTrbnet/TrbnetApp/src/devTrbnet.c_backup b/Trbnet/devTrbnet/TrbnetApp/src/devTrbnet.c_backup
new file mode 100644 (file)
index 0000000..d9a3ce1
--- /dev/null
@@ -0,0 +1,871 @@
+/****** 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\"", &reg_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
diff --git a/Trbnet/devTrbnet/TrbnetApp/src/devTrbnet2.c b/Trbnet/devTrbnet/TrbnetApp/src/devTrbnet2.c
new file mode 100644 (file)
index 0000000..8e4b4ec
--- /dev/null
@@ -0,0 +1,755 @@
+/****** 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\"", &reg_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
diff --git a/Trbnet/devTrbnet/TrbnetApp/src/devTrbnet3.c b/Trbnet/devTrbnet/TrbnetApp/src/devTrbnet3.c
new file mode 100644 (file)
index 0000000..a19a2e2
--- /dev/null
@@ -0,0 +1,302 @@
+/*******************************************************************************
+ * 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, &reg_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;
+}
+
diff --git a/Trbnet/devTrbnet/TrbnetApp/src/devTrbnet_save.c b/Trbnet/devTrbnet/TrbnetApp/src/devTrbnet_save.c
new file mode 100644 (file)
index 0000000..e6ce923
--- /dev/null
@@ -0,0 +1,769 @@
+/****** 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\"", &reg_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
diff --git a/Trbnet/devTrbnet/TrbnetApp/src/devTrbnet_test.c b/Trbnet/devTrbnet/TrbnetApp/src/devTrbnet_test.c
new file mode 100644 (file)
index 0000000..0c76021
--- /dev/null
@@ -0,0 +1,869 @@
+/****** 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\"", &reg_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
index 1f332603d20906b46ab1104780d95768ba63075f..7d487af259e350d42053b2a1005ca2ccdb16f875 100644 (file)
@@ -3,6 +3,7 @@
 < envPaths
 epicsEnvSet("EPICS_TRBNET_XML_PATH","/home/adrian/trb/daqtools/xml-db/database/")
 epicsEnvSet("EPICS_TRBNET_XML_NAME","MDC")
+#epicsEnvSet("EPICS_TRBNET_XML_NAME","TrbNet")
 
 cd ${TOP}