diff --git a/cmds/config_file/lab_testbed.json b/cmds/config_file/lab_testbed.json index 0060d7055e4f82f7bd584ca73a08b48f4e6361c7..fe6d63c63dcefa3c0c986cfa3e55ba9dc04e4f65 100644 --- a/cmds/config_file/lab_testbed.json +++ b/cmds/config_file/lab_testbed.json @@ -15,32 +15,24 @@ "output_queues" : { "default" : { "enabled" : false, - "eth_src_mac" : "0e:05:05:00:00:04", - "eth_dst_mac" : "50:6b:4b:c0:b2:50", - "ip_src_addr" : "192.168.10.10", - "ip_dst_addr" : "192.168.10.100", - "udp_src_port" : 8997, - "udp_dst_port" : 9000, + "destination_lut_index" : 0, "readout_type" : "0x48", "pkt_gen_enable" : false, "pkt_gen_idles" : "0x00000f", "pkt_gen_length" : "0x000000ff" }, "0": { - "enabled" : true, - "udp_dst_port" : 9000 - }, - "1": { - "enabled" : false, - "udp_dst_port" : 9001 - }, - "2": { - "enabled" : false, - "udp_dst_port" : 9002 - }, - "3": { - "enabled" : false, - "udp_dst_port" : 9003 + "enabled" : true + } + }, + "udp_core" : { + "src_mac" : "0e:05:05:00:00:04", + "src_ip" : "192.168.10.1", + "src_port" : 9000, + "arp_refresh_timeout" : 1228.7, + "arp_reply_timeout" : 25.5, + "lut" : { + "0": { "dst_ip" : "192.168.10.100", "dst_port" : 51001} } } } \ No newline at end of file diff --git a/cmds/st.cmd b/cmds/st.cmd index f6ccfa7ae796298c5c61f05672b3743ec7148f20..9f5e01fed9d219c5124dd52ce9316e1c6c380db2 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -11,15 +11,18 @@ drvAsynIPPortConfigure("L0", "$(IPADDR):$(IPPORT) UDP", 0, 0, 1) #asynSetTraceIOMask( L0, -1, 0x4) #asynSetTraceInfoMask ( L0, -1, 0x9) -RMMConfig("RMM", "L0", "/home/iocuser/douglas/fe-vmm-tbl/cmds/config_file/lab_testbed.json" 0) -VMMTblConfig("RMM", 0, 0) +RMMConfig("RMM", "L0", "/home/iocuser/douglas/fe-vmm-tbl/cmds/config_file/lab_testbed.json", 0) + +#VMMTblConfig("portName", ring, number_hybrids) +VMMTblConfig("RMM", 0, 2) dbLoadRecords("${asyn_DIR}/db/asynRecord.db","P=asyn:,R=Test,PORT=L0,ADDR=0,IMAX=0,OMAX=0") dbLoadRecords($(rmm_DB)/rmm.db, "P=$(P), R=$(R), PORT=RMM, ADDR=0, TIMEOUT=1") dbLoadRecords($(rmm_DB)/rmm_sensors.db, "P=$(P), R=$(R), PORT=RMM, TIMEOUT=1") -dbLoadRecords($(rmm_DB)/topology.db, "P=$(P), R=$(R), PORT=RMM, TIMEOUT=1") +dbLoadRecords($(rmm_DB)/ring.db, "P=$(P), R=$(R), ADDR=0, PORT=RMM, TIMEOUT=1") dbLoadRecords("$(rmm_DB)/rmm_packets.template", "P=$(P), R=$(R), PORT=RMM, RING=0, NODE=0, ADDR=0, TIMEOUT=1") +dbLoadRecords("$(rmm_DB)/topology.template", "P=$(P), R=$(R), PORT=RMM, RING=0, NODE=0, ADDR=0, TIMEOUT=1") dbLoadRecords("$(vmmTbl_DB)/vmm_tbl.db", "P=$(P), R=NDet-VMM-001:, PORT=RMM, RING=0, NODE=0, ADDR=0, TIMEOUT=1") @@ -34,4 +37,4 @@ dbpf $(P)$(R)VoltVCC1V2-R.SCAN 2 dbpf $(P)$(R)VoltMGTAVCC-R.SCAN 2 dbpf $(P)$(R)VoltMGTAVTT-R.SCAN 2 dbpf $(P)$(R)VoltVCCINTIOBRAM-R.SCAN 2 -# \ No newline at end of file +# diff --git a/vmmTblApp/src/vmm_config.cpp b/vmmTblApp/src/vmm_config.cpp index 1e1132c2aca6c2c9dc48ec150e9a3b704fc69cf4..cee4c5ede01ca0e3a2aeda5bdee3982edf12064b 100644 --- a/vmmTblApp/src/vmm_config.cpp +++ b/vmmTblApp/src/vmm_config.cpp @@ -46,10 +46,10 @@ void FENConfigModule::sendAll(bool useConfigCheck) { } void FENConfigModule::enableAcquisition(bool enabled) { - pFEN->user_reg_write("app_acq_enable", enabled); - pFEN->user_reg_write("sc_acq_on_off", 0x00000000); - pFEN->user_reg_write("sc_acq_on_off", 0x00000001); - pFEN->user_reg_write("sc_acq_on_off", 0x00000000); + pFEN->userRegWrite("app_acq_enable", enabled); + pFEN->userRegWrite("sc_acq_on_off", 0x00000000); + pFEN->userRegWrite("sc_acq_on_off", 0x00000001); + pFEN->userRegWrite("sc_acq_on_off", 0x00000000); } void FENConfigModule::checkLinkStatus(std::string& message, std::vector<std::string>& linkStatus) { @@ -71,18 +71,18 @@ void FENConfigModule::checkLinkStatus(std::string& message, std::vector<std::str } void FENConfigModule::configFEN() { - pFEN->user_reg_write("app_debug_data_format", 0); - pFEN->user_reg_write("app_latency_reset", 27); - pFEN->user_reg_write("app_latency_data_max", 1024); - pFEN->user_reg_write("app_latency_data_jitter", 0); - pFEN->user_reg_write("app_tp_offset_first", 100); - pFEN->user_reg_write("app_tp_offset", 1000); - pFEN->user_reg_write("app_tp_latency", 46); - pFEN->user_reg_write("app_tp_number", 1); - pFEN->user_reg_write("app_chmask", getChMap()); - pFEN->user_reg_write("sc_cfg_app", 0x00000000); - pFEN->user_reg_write("sc_cfg_app", 0x00000001); - pFEN->user_reg_write("sc_cfg_app", 0x00000000); + pFEN->userRegWrite("app_debug_data_format", 0); + pFEN->userRegWrite("app_latency_reset", 27); + pFEN->userRegWrite("app_latency_data_max", 1024); + pFEN->userRegWrite("app_latency_data_jitter", 0); + pFEN->userRegWrite("app_tp_offset_first", 100); + pFEN->userRegWrite("app_tp_offset", 1000); + pFEN->userRegWrite("app_tp_latency", 46); + pFEN->userRegWrite("app_tp_number", 1); + pFEN->userRegWrite("app_chmask", getChMap()); + pFEN->userRegWrite("sc_cfg_app", 0x00000000); + pFEN->userRegWrite("sc_cfg_app", 0x00000001); + pFEN->userRegWrite("sc_cfg_app", 0x00000000); } uint16_t FENConfigModule::getChMap() { @@ -122,13 +122,13 @@ void FENConfigModule::configHybrid(int hybrid_index) { for (const auto& reg : registers) { unsigned short result = 0; hybrids[hybrid_index].getRegister(reg, result); - pFEN->user_reg_write(reg + std::to_string(hybrid_index), result); + pFEN->userRegWrite(reg + std::to_string(hybrid_index), result); } uint32_t value = (1 << hybrid_index); - pFEN->user_reg_write("sc_cfg_hyb", 0x0); - pFEN->user_reg_write("sc_cfg_hyb", value); - pFEN->user_reg_write("sc_cfg_hyb", 0x0); + pFEN->userRegWrite("sc_cfg_hyb", 0x0); + pFEN->userRegWrite("sc_cfg_hyb", value); + pFEN->userRegWrite("sc_cfg_hyb", 0x0); } bool FENConfigModule::configVMM(int hybrid_index, int vmm_index, bool enableConfigCheck) @@ -192,7 +192,7 @@ bool FENConfigModule::configVMM(int hybrid_index, int vmm_index, bool enableConf for(unsigned int i = firstGlobalRegSPI_2; i <= lastGlobalRegSPI_2; i++) { std::string param = "vmm_global_bank2_sp" + std::to_string(i - firstGlobalRegSPI_2) + sVmmIndex; uint32_t value = std::stoul(globalRegisters2[i - firstGlobalRegSPI_2], nullptr, 2); - pFEN->user_reg_write(param, value); + pFEN->userRegWrite(param, value); } //channel SPI @@ -202,20 +202,20 @@ bool FENConfigModule::configVMM(int hybrid_index, int vmm_index, bool enableConf std::string param = "vmm_ch" + position_str + sVmmIndex; uint32_t value = std::stoul(channelRegisters[i], nullptr, 2); std::cout << "param: " << param << std::endl; - pFEN->user_reg_write(param, value); + pFEN->userRegWrite(param, value); } // global SPI / VMM3: global bank 1 for(unsigned int i = firstGlobalRegSPI_1; i <= lastGlobalRegSPI_1; i++) { std::string param = "vmm_global_bank1_sp" + std::to_string(i - firstGlobalRegSPI_1) + sVmmIndex; uint32_t value = std::stoul(globalRegisters[i - firstGlobalRegSPI_1], nullptr, 2); - pFEN->user_reg_write(param, value); + pFEN->userRegWrite(param, value); } uint32_t value = (1 << idx); - pFEN->user_reg_write("sc_cfg_vmm", 0x00000000); - pFEN->user_reg_write("sc_cfg_vmm", value); - pFEN->user_reg_write("sc_cfg_vmm", 0x00000000); + pFEN->userRegWrite("sc_cfg_vmm", 0x00000000); + pFEN->userRegWrite("sc_cfg_vmm", value); + pFEN->userRegWrite("sc_cfg_vmm", 0x00000000); return result; } @@ -418,16 +418,16 @@ int FENConfigModule::readADC(int hybrid_index, int vmm_index) { uint32_t FENConfigModule::readWriteRegs(std::string command_reg, int index, std::string read_reg) { unsigned int data = 0x00000000; - pFEN->user_reg_write(command_reg, data); + pFEN->userRegWrite(command_reg, data); data = (1 << index); - pFEN->user_reg_write(command_reg, data); + pFEN->userRegWrite(command_reg, data); //Do not read registers back too soon, otherwise old ADC value is read delayMilliseconds(7); - uint32_t value = pFEN->user_reg_read(read_reg); + uint32_t value = pFEN->userRegRead(read_reg); std::cout << "value: " << value << std::endl; - pFEN->user_reg_write(command_reg, 0x0); + pFEN->userRegWrite(command_reg, 0x0); return value; } diff --git a/vmmTblApp/src/vmm_tbl.cpp b/vmmTblApp/src/vmm_tbl.cpp index 6e4fa7bfadfa44065f0f4c0432a287bea86c49c3..16150768f39d085def210b9293d8ff7df0f098e8 100644 --- a/vmmTblApp/src/vmm_tbl.cpp +++ b/vmmTblApp/src/vmm_tbl.cpp @@ -1,28 +1,32 @@ #include "vmm_tbl.h" /** Constructor for the VMMTbl class */ -VMMTbl::VMMTbl(RMM& rmm, int ring, int node) +VMMTbl::VMMTbl(RMM& rmm, int ring, int node, int hybrids) : FrontEndBase(rmm.get_rmm_reg_access(), ring, node), pVMMConfig(*this), pRMM(&rmm) { + number_hybrids = hybrids; addr_list = ring * NUMBER_NODES_PER_RING + node; fe_addr_map[ring] = vmm_tbl_register_map; - create_epics_params(); - set_initial_epics_params(); + createEpicsParams(); + setInitialEpicsParams(); pRMM->get_rmm_rings().set_topology(ring, node, "vmm-tbl"); - pVMMConfig.enableHybrid(0, true); + pRMM->updateTopologyPvs(ring, node, "ac701"); + for (int hyb = 0; hyb < number_hybrids; hyb++) { + pVMMConfig.enableHybrid(hyb, true); + } } -void VMMTbl::config_FE() { +void VMMTbl::configFE() { puts("config_FE"); } -void VMMTbl::set_initial_epics_params() { +void VMMTbl::setInitialEpicsParams() { puts("set_initial_epics_params"); } -asynStatus VMMTbl::create_epics_params() { +asynStatus VMMTbl::createEpicsParams() { pRMM->createParam(addr_list, "SEL_ANALOG_MONITOR_VMM0", asynParamInt32, &vmmSelectMonitorVMM0_); pRMM->createParam(addr_list, "SEL_ANALOG_MONITOR_VMM1", asynParamInt32, &vmmSelectMonitorVMM1_); pRMM->createParam(addr_list, "READ_ADC_VMMS", asynParamInt32, &vmmProcessReadMonitorVMMs_); @@ -64,7 +68,7 @@ asynStatus VMMTbl::writeInt32(asynUser *pasynUser, epicsInt32 value) { // enable test_pulse (st) of Hybrid 0, VMM 0, channel 0 to test purpose // TODO: ADD PVs to enable/disable that pVMMConfig.getHybrid(0).getVMM(0).setRegister("st", 1, 0); - + if (value) pVMMConfig.acquire(true); else pVMMConfig.acquire(false); } @@ -83,15 +87,16 @@ asynStatus VMMTbl::writeFloat64(asynUser *pasynUser, epicsFloat64 value) { extern "C" { - static void VMMTblConfig(const char *rmm_port_name, int ring, int node) { + static void VMMTblConfig(const char *rmm_port_name, int ring, int hybrids) { + int node = 0; // VMM use always only the Node 0 RMM *pRMM; pRMM = (RMM *) findAsynPortDriver(rmm_port_name); - pRMM->frontends[ring][node] = std::make_shared<VMMTbl>(*pRMM, ring, node); + pRMM->frontends[ring][node] = std::make_shared<VMMTbl>(*pRMM, ring, node, hybrids); } static const iocshArg configArg0 = { "RMM Port name", iocshArgString}; static const iocshArg configArg1 = { "Ring", iocshArgInt}; - static const iocshArg configArg2 = { "Node", iocshArgInt}; + static const iocshArg configArg2 = { "Hybrids", iocshArgInt}; static const iocshArg * const configArgs[] = {&configArg0, diff --git a/vmmTblApp/src/vmm_tbl.h b/vmmTblApp/src/vmm_tbl.h index 5d92c5fa3dc46d34af2680dc43b15cf2aca4995a..727dfb71b4ff6b0365341eb887213894c4f63026 100644 --- a/vmmTblApp/src/vmm_tbl.h +++ b/vmmTblApp/src/vmm_tbl.h @@ -8,12 +8,12 @@ /** Class definition for the VMMTbl class */ class VMMTbl : public FrontEndBase { public: - VMMTbl(RMM& rmm, int ring, int node); - asynStatus create_epics_params(); + VMMTbl(RMM& rmm, int ring, int node, int hybrids); + asynStatus createEpicsParams(); virtual asynStatus writeInt32(asynUser *pasynUser, epicsInt32 value); virtual asynStatus writeFloat64(asynUser *pasynUser, epicsFloat64 value); - void set_initial_epics_params(); - void config_FE(); + void setInitialEpicsParams(); + void configFE(); protected: int vmmSelectMonitorVMM0_; @@ -27,4 +27,5 @@ private: FENConfigModule pVMMConfig; RMM *pRMM; int addr_list = 0; + int number_hybrids; };