diff --git a/dbd/ecmc_socketcan.dbd b/dbd/ecmc_socketcan.dbd new file mode 100644 index 0000000..47f5539 --- /dev/null +++ b/dbd/ecmc_socketcan.dbd @@ -0,0 +1,2 @@ +function(ecmcWriteArrayUint8ElementsInit) +function(ecmcWriteArrayUint8Elements) diff --git a/ecmc_plugin_socketcan.Makefile b/ecmc_plugin_socketcan.Makefile index 8e909c5..f924cc6 100644 --- a/ecmc_plugin_socketcan.Makefile +++ b/ecmc_plugin_socketcan.Makefile @@ -57,6 +57,7 @@ SOURCES += $(APPSRC)/ecmcCANOpenSDO.cpp SOURCES += $(APPSRC)/ecmcCANOpenPDO.cpp SOURCES += $(APPSRC)/ecmcCANOpenDevice.cpp SOURCES += $(APPSRC)/ecmcCANOpenMaster.cpp +SOURCES += $(APPSRC)/ecmcWriteArrayUint8Elements.cpp DBDS += $(APPSRC)/ecmcSocketCAN.dbd diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcan.Makefile b/ecmc_plugin_socketcan/ecmc_plugin_socketcan.Makefile index 8e909c5..f924cc6 100644 --- a/ecmc_plugin_socketcan/ecmc_plugin_socketcan.Makefile +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcan.Makefile @@ -57,6 +57,7 @@ SOURCES += $(APPSRC)/ecmcCANOpenSDO.cpp SOURCES += $(APPSRC)/ecmcCANOpenPDO.cpp SOURCES += $(APPSRC)/ecmcCANOpenDevice.cpp SOURCES += $(APPSRC)/ecmcCANOpenMaster.cpp +SOURCES += $(APPSRC)/ecmcWriteArrayUint8Elements.cpp DBDS += $(APPSRC)/ecmcSocketCAN.dbd diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/Db/pmu905BasicConfig.old.template b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/Db/pmu905BasicConfig.old.template new file mode 100644 index 0000000..d158290 --- /dev/null +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/Db/pmu905BasicConfig.old.template @@ -0,0 +1,126 @@ +########################################################################### +############## Byte 0 +record(bo,"$(P)CAN${CH_ID}-PowerOnCmd") { + field(DESC, "Power on") + field(VAL, "0") + field(ONAM, "On") + field(ZNAM, "Off") + field(OUT, "$(P)CAN${CH_ID}-BasicConfigB0_.B0") + field(FLNK, "$(P)CAN${CH_ID}-BasicConfigB0_.PROC") +} + +# Probably not valid for pmu905 (see note bottom in table) +#record(bo,"$(P)CAN${CH_ID}-PEAK_AV") { +# field(DESC, "PEAK/AV") +# field(VAL, "0") +# field(ONAM, "PEAK") +# field(ZNAM, "AV") +# field(OUT, "$(P)CAN${CH_ID}-BasicConfigB0_.B1") +# field(FLNK, "$(P)CAN${CH_ID}-BasicConfigB0_.PROC") +#} + +record(mbboDirect,"$(P)CAN${CH_ID}-BasicConfigB0_"){ + info(asyn:READBACK,"1") + field(DESC, "Basic Config B0") + field(PINI, "1") + field(VAL, "0") + field(OUT, "$(P)CAN${CH_ID}-SDO02-BasicConfig.[0] CA") + field(FLNK, "$(P)CAN${CH_ID}-SDO02-BasicConfig.PROC") +} + +########################################################################### +############## Byte 1..2 Vref 0..5000 + +record(ao,"$(P)CAN${CH_ID}-VrefPwrCmd") { + field(DESC, "Vref 0..5000") + field(VAL, "0") + field(OUT, "") + field(EGU, "mV") + field(PREC, "0") + field(FLNK, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB1_.PROC") +} + +# first byte +record(calc, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB1_") { + field(DESC, "Calc byte 1") + field(CALC, "A & 0xFF") + field(INPA, "$(P)CAN${CH_ID}-VrefPwrCmd.VAL") + field(FLNK, "$(P)CAN${CH_ID}-BasicConfigB1_.PROC") +} + +record(ao,"$(P)CAN${CH_ID}-BasicConfigB1_"){ + field(DESC, "Basic config B1") + field(VAL, "0") + field(PREC, "0") + field(OUT, "$(P)CAN${CH_ID}-SDO02-BasicConfig.[1] CA") + field(OMSL, "closed_loop") + field(DOL, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB1_.VAL") + field(FLNK, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB2_.PROC") +} + +# second byte +record(calc, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB2_") { + field(DESC, "Calc byte 2") + field(CALC, "(A >> 8) & 0xFF") + field(INPA, "$(P)CAN${CH_ID}-VrefPwrCmd.VAL") + field(FLNK, "$(P)CAN${CH_ID}-BasicConfigB2_.PROC") +} + +record(ao,"$(P)CAN${CH_ID}-BasicConfigB2_"){ + field(DESC, "Basic config B2") + field(VAL, "0") + field(PREC, "0") + field(OUT, "$(P)CAN${CH_ID}-SDO02-BasicConfig.[2] CA") + field(OMSL, "closed_loop") + field(DOL, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB2_.VAL") + field(FLNK, "$(P)CAN${CH_ID}-SDO02-BasicConfig.PROC") # Process now! +} + +########################################################################### +############## Byte 3..4 Vref 4800..10000 + +record(ao,"$(P)CAN${CH_ID}-VdcCtrlCmd") { + field(DESC, "Vref 4800..10000") + field(VAL, "0") + field(EGU, "mV") + field(PREC, "0") + field(FLNK, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB3_.PROC") +} + +# third byte +record(calc, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB3_") { + field(DESC, "Calc byte 3") + field(CALC, "A & 0xFF") + field(INPA, "$(P)CAN${CH_ID}-VdcCtrlCmd.VAL") + field(FLNK, "$(P)CAN${CH_ID}-BasicConfigB3_.PROC") +} + +record(ao,"$(P)CAN${CH_ID}-BasicConfigB3_"){ + field(DESC, "Basic config B3") + field(VAL, "0") + field(PREC, "0") + field(OUT, "$(P)CAN${CH_ID}-SDO02-BasicConfig.[3] CA") + field(OMSL, "closed_loop") + field(DOL, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB3_.VAL") + field(FLNK, "$(P)CAN${CH_ID}-SDO02-VrefPwrCmdCalcB4_.PROC") # Process next byte +} + +# fourth byte +record(calc, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB4_") { + field(DESC, "Calc byte 4") + field(CALC, "(A >> 8) & 0xFF") + field(INPA, "$(P)CAN${CH_ID}-VdcCtrlCmd.VAL") + field(FLNK, "$(P)CAN${CH_ID}-BasicConfigB4_.PROC") +} + +record(ao,"$(P)CAN${CH_ID}-BasicConfigB4_"){ + field(DESC, "Basic config B4") + field(VAL, "0") + field(PREC, "0") + field(OUT, "$(P)CAN${CH_ID}-SDO02-BasicConfig.[4] CA") + field(OMSL, "closed_loop") + field(DOL, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB4_.VAL") + field(FLNK, "$(P)CAN${CH_ID}-SDO02-BasicConfig.PROC") # Process now! +} + +# Byte 5..7 0 diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/Db/pmu905BasicConfig.template b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/Db/pmu905BasicConfig.template index 02d09a7..4453ced 100644 --- a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/Db/pmu905BasicConfig.template +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/Db/pmu905BasicConfig.template @@ -24,11 +24,9 @@ record(mbboDirect,"$(P)CAN${CH_ID}-BasicConfigB0_"){ field(DESC, "Basic Config B0") field(PINI, "1") field(VAL, "0") - field(OUT, "$(P)CAN${CH_ID}-SDO02-BasicConfig.[0]") - field(FLNK, "$(P)CAN${CH_ID}-SDO02-BasicConfig.PROC") + field(FLNK, "$(P)CAN${CH_ID}-BasicConfigPackArray_.PROC") } - ########################################################################### ############## Byte 1..2 Vref 0..5000 @@ -44,33 +42,17 @@ record(ao,"$(P)CAN${CH_ID}-VrefPwrCmd") { # first byte record(calc, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB1_") { field(DESC, "Calc byte 1") - field(CALC, "A && 0xFF") + field(CALC, "A & 0xFF") field(INPA, "$(P)CAN${CH_ID}-VrefPwrCmd.VAL") - field(FLNK, "$(P)CAN${CH_ID}-BasicConfigB1_.PROC") -} - -record(ao,"$(P)CAN${CH_ID}-BasicConfigB1_"){ - field(DESC, "Basic config B1") - field(VAL, "0") - field(PREC, "0") - field(OUT, "$(P)CAN${CH_ID}-SDO02-BasicConfig.[1]") - #field(FLNK, "$(P)CAN${CH_ID}-SDO02-BasicConfig.PROC") # Only process when second byte is set + field(FLNK, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB2_.PROC") } # second byte record(calc, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB2_") { field(DESC, "Calc byte 2") - field(CALC, "(A && 0xFF00) >> 8") + field(CALC, "(A >> 8) & 0xFF") field(INPA, "$(P)CAN${CH_ID}-VrefPwrCmd.VAL") - field(FLNK, "$(P)CAN${CH_ID}-BasicConfigB2_.PROC") -} - -record(ao,"$(P)CAN${CH_ID}-BasicConfigB1_"){ - field(DESC, "Basic config B1") - field(VAL, "0") - field(PREC, "0") - field(OUT, "$(P)CAN${CH_ID}-SDO02-BasicConfig.[2]") - field(FLNK, "$(P)CAN${CH_ID}-SDO02-BasicConfig.PROC") # Process now! + field(FLNK, "$(P)CAN${CH_ID}-BasicConfigPackArray_.PROC") } ########################################################################### @@ -81,39 +63,88 @@ record(ao,"$(P)CAN${CH_ID}-VdcCtrlCmd") { field(VAL, "0") field(EGU, "mV") field(PREC, "0") - field(FLNK, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB1_.PROC") + field(FLNK, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB3_.PROC") } # third byte record(calc, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB3_") { field(DESC, "Calc byte 3") - field(CALC, "A && 0xFF") + field(CALC, "A & 0xFF") field(INPA, "$(P)CAN${CH_ID}-VdcCtrlCmd.VAL") - field(FLNK, "$(P)CAN${CH_ID}-BasicConfigB3_.PROC") -} - -record(ao,"$(P)CAN${CH_ID}-BasicConfigB3_"){ - field(DESC, "Basic config B3") - field(VAL, "0") - field(PREC, "0") - field(OUT, "$(P)CAN${CH_ID}-SDO02-BasicConfig.[3]") - #field(FLNK, "$(P)CAN${CH_ID}-SDO02-BasicConfig.PROC") # Only process when second byte is set + field(FLNK, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB4_.PROC") } # fourth byte -record(calc, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB4_") { +record(calc, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB4_") { field(DESC, "Calc byte 4") - field(CALC, "(A && 0xFF00) >> 8") + field(CALC, "(A >> 8) & 0xFF") field(INPA, "$(P)CAN${CH_ID}-VdcCtrlCmd.VAL") - field(FLNK, "$(P)CAN${CH_ID}-BasicConfigB4_.PROC") + field(FLNK, "$(P)CAN${CH_ID}-BasicConfigPackArray_.PROC") } +# +### COLLECT all bytes +#record(acalcout, "$(P)CAN${CH_ID}-BasicConfigCalc_") { +# field(DESC, "Calc to gather data from other records") +# field(NELM, "7") +# #field(CALC, "A>>0;B>>1;C>>2;D>>3;E>>4;0>>5;0>>6;") # Fill to 7 bytes +# #field(CALC, "AA+ARR([A,B,C,D,E,0,0]);") # Fill to 7 bytes +# #field(CALC, "AA:=ARR(A,B,C,D,E,0,0)") # Fill to 7 bytes +# #field(CALC, "CAT(AA[0,1],A);CAT(AA[0,2],B)") # Fill to 7 bytes +# #field(CALC, "AA+ARR(A,B,C,D,E,0,0)") # Fill to 7 bytes +# #field(CALC, "ARR(A,B,C,D,E,0,0);") # Fill to 7 bytes +# #field(CALC, "ARR([A,B,C,D,E,0,0]);") # Fill to 7 bytes +# #field(CALC, "AA[0]=A;AA[1]=B;AA[2]=C;AA[3]=D;AA[4]=E;AA[5]=0;AA[6]=0;AA*1;") # Fill to 7 bytes +# #field(CALC, "AA[0]:=A;AA[1]:=B;AA[2]:=C;AA[3]:=D;AA[4]:=E;AA[5]:=0;AA[6]:=0;AA;") # Fill to 7 bytes +# #field(CALC, "AA[0]:=A;AA[1]:=B;AA[2]:=C;AA[3]:=D;") # Fill to 7 bytes +# #field(CALC, "AA:=IX;AA;") # Fill to 7 bytes +# field(INPA, "$(P)CAN${CH_ID}-BasicConfigB0_.VAL") # Byte 0 +# field(INPB, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB1_.VAL") # Byte 1 +# field(INPC, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB2_.VAL") # Byte 2 +# field(INPD, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB3_.VAL") # Byte 3 +# field(INPE, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB4_.VAL") # Byte 4 +# #field(INAA, "$(P)CAN${CH_ID}-SDO02-BasicConfig") # Whole array +# field(OUT, "$(P)CAN${CH_ID}-SDO02-BasicConfig") # Send the data +# field(FLNK, "$(P)CAN${CH_ID}-SDO02-BasicConfig.PROC") # Send the data +#} +# +# Dummy 0 array +#record(waveform,"$(P)CAN${CH_ID}-BasicConfigDummy_"){ +# field(DESC, "DUMMY ARRAY") +# field(NELM, "7") +# field(PINI, "YES") +# field(VAL, "0") +#} +# -record(ao,"$(P)CAN${CH_ID}-BasicConfigB4_"){ - field(DESC, "Basic config B4") - field(VAL, "0") - field(PREC, "0") - field(OUT, "$(P)CAN${CH_ID}-SDO02-BasicConfig.[4]") - field(FLNK, "$(P)CAN${CH_ID}-SDO02-BasicConfig.PROC") # Process now! +record(aSub, "$(P)CAN${CH_ID}-BasicConfigPackArray_") { + field(INAM, "ecmcWriteArrayUint8ElementsInit") + field(SNAM, "ecmcWriteArrayUint8Elements") + field(FTA, "UCHAR") + field(NOA, "1") + field(INPA, "7") + field(FTB, "UCHAR") + field(NOB, "1") + field(INPB, "$(P)CAN${CH_ID}-BasicConfigB0_.VAL") # Byte 0 + field(FTC, "UCHAR") + field(NOC, "1") + field(INPC, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB1_.VAL") # Byte 1 + field(FTD, "UCHAR") + field(NOD, "1") + field(INPD, "$(P)CAN${CH_ID}-VrefPwrCmdCalcB2_.VAL") # Byte 2 + field(FTE, "UCHAR") + field(NOE, "1") + field(INPE, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB3_.VAL") # Byte 3 + field(FTF, "UCHAR") + field(NOF, "1") + field(INPF, "$(P)CAN${CH_ID}-VdcCtrlCmdCalcB4_.VAL") # Byte 4 + field(FTG, "UCHAR") + field(NOG, "1") + field(INPG, "0") # Byte 5 + field(FTH, "UCHAR") + field(NOH, "1") + field(INPH, "0") # Byte 6 + field(FTVA, "UCHAR") + field(OUTA, "$(P)CAN${CH_ID}-SDO02-BasicConfig") + field(NOVA, "7") + field(FLNK, "$(P)CAN${CH_ID}-SDO02-BasicConfig.PROC") # Send the data } - -# Byte 5..7 0 diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/Db/test.template b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/Db/test.template new file mode 100644 index 0000000..2a149fb --- /dev/null +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/Db/test.template @@ -0,0 +1,13 @@ + + +record(acalcout,"$(P)LeftMoveData_"){ + field(DESC, "Move data from EL3702 to EL4732") + field(INAA, "$(P)ec$(MASTER_ID)-s$(SLAVE_AI)-EL3702_s$(NELM)-AI1-Array.VAL") + field(INPA, "$(P)LeftGain.VAL") + field(INPB, "$(P)LeftOffset.VAL") + field(INPC, "$(P)Volume.VAL") + field(CALC, "(C/200*A/100*AA+(B*3276.8))") + field(OUT, "$(P)ec$(MASTER_ID)-s$(SLAVE_AO)-EL4732_s$(NELM)-AO1-Array.VAL") + field(FLNK, "$(P)ec$(MASTER_ID)-s$(SLAVE_AO)-EL4732_s$(NELM)-AO1-Array.PROC") + field(NELM, "$(NELM)") +} \ No newline at end of file diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.dbd b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.dbd index 1647b4c..8418fc9 100644 --- a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.dbd +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcSocketCAN.dbd @@ -1 +1,4 @@ registrar("ecmcCANPluginDriverRegister") +function(ecmcWriteArrayUint8ElementsInit) +function(ecmcWriteArrayUint8Elements) + diff --git a/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcWriteArrayUint8Elements.cpp b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcWriteArrayUint8Elements.cpp new file mode 100644 index 0000000..941b061 --- /dev/null +++ b/ecmc_plugin_socketcan/ecmc_plugin_socketcanApp/src/ecmcWriteArrayUint8Elements.cpp @@ -0,0 +1,172 @@ +// aSub, EPICS related headers +#include +#include +#include +// std::cout +#include +// split double into fractional and integer +#include +#include + +// declare init function +static long ecmcWriteArrayUint8ElementsInit(struct aSubRecord *rec); +epicsRegisterFunction(ecmcWriteArrayUint8ElementsInit); + +// declare worker function +static long ecmcWriteArrayUint8Elements(struct aSubRecord *rec); +epicsRegisterFunction(ecmcWriteArrayUint8Elements); + +// init (INAM) +static long ecmcWriteArrayUint8ElementsInit(struct aSubRecord *rec){ + std::cout << "ecmcWriteArrayUint8ElementsInit aSubRecord: "<< rec->name << std::endl; + printf("ecmcWriteArrayUint8ElementsInit aSubRecord: %d\n",rec->noa); + return 0; +} + +////noa elements in A +////Note that the subroutine code must always handle the value fields (A-U, VALA-VALU) as arrays, even if they contain only a single element. +// /*memcpy(pwfData, (double *)precord->a, precord->noa * +//sizeof(double)); +////data processing on pwfData: std, max, min, fft,... +// ... +// +// /* put the calculated results into ai records*/ +// *(double *)precord->vala = ave;*/ +// +//// work (SNAM) +// NEVA output filed size +static long ecmcWriteArrayUint8Elements(struct aSubRecord *rec){ + printf("EXECUTING!!!!!\n"); + + // input A must be size of output array + if(rec->noa !=1){ + printf("Input A not scalar\n"); + return 0; + } + + epicsUInt8 sizeOfBuffer=*(epicsUInt8*)rec->a; + + // Max 20 byte in a row + if(sizeOfBuffer <=0 || sizeOfBuffer>18){ + printf("Input A out of range\n"); + return 0; + } + + + if(sizeOfBuffer != rec->nova){ + printf("Size missmatch\n"); + return 0; + } + + + printf("EXECUTING!!!!!\n"); + epicsUInt8 *buffer; + buffer=new epicsUInt8[rec->noa]; + memset(buffer,0,sizeOfBuffer); + + if(sizeOfBuffer >= 1 && rec->nob ==1) { + buffer[1]=*(epicsUInt8 *)rec->b; + } + + if(sizeOfBuffer >= 2 && rec->noc ==1) { + buffer[2]=*(epicsUInt8 *)rec->c; + } + + if(sizeOfBuffer >= 3 && rec->nod ==1) { + buffer[3]=*(epicsUInt8 *)rec->d; + } + + if(sizeOfBuffer >= 4 && rec->noe ==1) { + buffer[4]=*(epicsUInt8 *)rec->e; + } + + if(sizeOfBuffer >= 5 && rec->nof ==1) { + buffer[5]=*(epicsUInt8 *)rec->f; + } + + if(sizeOfBuffer >= 6 && rec->nog ==1) { + buffer[6]=*(epicsUInt8 *)rec->g; + } + + if(sizeOfBuffer >= 7 && rec->noh ==1) { + buffer[7]=*(epicsUInt8 *)rec->h; + } + + if(sizeOfBuffer >= 8 && rec->noi ==1) { + buffer[8]=*(epicsUInt8 *)rec->i; + } + + if(sizeOfBuffer >= 9 && rec->noj ==1) { + buffer[9]=*(epicsUInt8 *)rec->j; + } + + if(sizeOfBuffer >= 10 && rec->nok ==1) { + buffer[10]=*(epicsUInt8 *)rec->k; + } + + if(sizeOfBuffer >= 11 && rec->nol ==1) { + buffer[11]=*(epicsUInt8 *)rec->l; + } + + if(sizeOfBuffer >= 12 && rec->nom ==1) { + buffer[12]=*(epicsUInt8 *)rec->m; + } + + if(sizeOfBuffer >= 13 && rec->non ==1) { + buffer[13]=*(epicsUInt8 *)rec->n; + } + + if(sizeOfBuffer >= 14 && rec->noo ==1) { + buffer[14]=*(epicsUInt8 *)rec->o; + } + + if(sizeOfBuffer >= 15 && rec->nop ==1) { + buffer[15]=*(epicsUInt8 *)rec->p; + } + + if(sizeOfBuffer >= 16 && rec->noq ==1) { + buffer[16]=*(epicsUInt8 *)rec->q; + } + + if(sizeOfBuffer >= 17 && rec->nor ==1) { + buffer[17]=*(epicsUInt8 *)rec->r; + } + + if(sizeOfBuffer >= 18 && rec->nos ==1) { + buffer[18]=*(epicsUInt8 *)rec->s; + } + +// if(sizeOfBuffer >= 19 && rec->not ==1) { +// buffer[19]=*(epicsUInt8 *)rec->t; +// } +// +// if(sizeOfBuffer >= 20 && rec->nou ==1) { +// buffer[20]=*(epicsUInt8 *)rec->u; +// } + + // better to use vala direct instead of buffer... hmm + epicsUInt8 *vala; + vala = (epicsUInt8 *)rec->vala; + for(int i = 0; i