From 5a7eeb3d763040c4af92e1d71e9d0c95629e0677 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 12 Jun 2020 16:22:31 +0200 Subject: [PATCH 01/28] WIP --- .../eigerDetectorServer/FebControl.c | 87 +++---------------- .../eigerDetectorServer/FebControl.h | 22 +---- 2 files changed, 14 insertions(+), 95 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 3864902e3..1354f2e4f 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -64,66 +64,12 @@ int Feb_Control_hv_fd = -1; void Module_Module(struct Module *mod, unsigned int number, unsigned int address_top) { mod->module_number = number; - mod->top_address_valid = 1; - mod->top_left_address = 0x100 | (0xff & address_top); - mod->top_right_address = (0x200 | (0xff & address_top)); - mod->bottom_address_valid = 0; - mod->bottom_left_address = 0; - mod->bottom_right_address = 0; - + mod->left_address = 0x100 | (0xff & address_top); + mod->right_address = (0x200 | (0xff & address_top)); mod->high_voltage = -1; - mod->top_dac = malloc(Module_ndacs * sizeof(int)); - mod->bottom_dac = malloc(Module_ndacs * sizeof(int)); + mod->dac = malloc(Module_ndacs * sizeof(int)); for (unsigned int i = 0; i < Module_ndacs; i++) - mod->top_dac[i] = mod->top_address_valid ? -1 : 0; - for (unsigned int i = 0; i < Module_ndacs; i++) - mod->bottom_dac[i] = mod->bottom_address_valid ? -1 : 0; -} - -void Module_ModuleBottom(struct Module *mod, unsigned int number, - unsigned int address_bottom) { - mod->module_number = number; - mod->top_address_valid = 0; - mod->top_left_address = 0; - mod->top_right_address = 0; - mod->bottom_address_valid = 1; - mod->bottom_left_address = 0x100 | (0xff & address_bottom); - mod->bottom_right_address = (0x200 | (0xff & address_bottom)); - - mod->high_voltage = -1; - - for (unsigned int i = 0; i < 4; i++) - mod->idelay_top[i] = mod->idelay_bottom[i] = 0; - - mod->top_dac = malloc(Module_ndacs * sizeof(int)); - mod->bottom_dac = malloc(Module_ndacs * sizeof(int)); - for (unsigned int i = 0; i < Module_ndacs; i++) - mod->top_dac[i] = mod->top_address_valid ? -1 : 0; - for (unsigned int i = 0; i < Module_ndacs; i++) - mod->bottom_dac[i] = mod->bottom_address_valid ? -1 : 0; -} - -void Module_Module1(struct Module *mod, unsigned int number, - unsigned int address_top, unsigned int address_bottom) { - mod->module_number = number; - mod->top_address_valid = 1; - mod->top_left_address = 0x100 | (0xff & address_top); - mod->top_right_address = 0x200 | (0xff & address_top); - mod->bottom_address_valid = 1; - mod->bottom_left_address = 0x100 | (0xff & address_bottom); - mod->bottom_right_address = 0x200 | (0xff & address_bottom); - - mod->high_voltage = -1; - - for (unsigned int i = 0; i < 4; i++) - mod->idelay_top[i] = mod->idelay_bottom[i] = 0; - - mod->top_dac = malloc(Module_ndacs * sizeof(int)); - mod->bottom_dac = malloc(Module_ndacs * sizeof(int)); - for (unsigned int i = 0; i < Module_ndacs; i++) - mod->top_dac[i] = mod->top_address_valid ? -1 : 0; - for (unsigned int i = 0; i < Module_ndacs; i++) - mod->bottom_dac[i] = mod->bottom_address_valid ? -1 : 0; + mod->dac[i] = 0; } unsigned int Module_GetModuleNumber(struct Module *mod) { @@ -222,7 +168,7 @@ int Feb_Control_Init(int master, int top, int normal, int module_num) { Feb_control_normal = normal; // global send - Feb_Control_AddModule1(0, 1, 0xff, 0, 1); + Feb_Control_AddModule(0, 0xff); Feb_Control_PrintModuleList(); Feb_Control_module_number = (module_num & 0xFF); @@ -232,7 +178,7 @@ int Feb_Control_Init(int master, int top, int normal, int module_num) { Feb_Control_current_index = 1; // Add the half module - Feb_Control_AddModule1(Feb_Control_module_number, top, serial, serial, 1); + Feb_Control_AddModule(Feb_Control_module_number, serial); Feb_Control_PrintModuleList(); unsigned int nfebs = 0; @@ -389,13 +335,8 @@ int Feb_Control_CheckModuleAddresses(struct Module *m) { int Feb_Control_AddModule(unsigned int module_number, unsigned int top_address) { - return Feb_Control_AddModule1(module_number, 1, top_address, 0, 1); -} -int Feb_Control_AddModule1(unsigned int module_number, int top_enable, - unsigned int top_address, - unsigned int bottom_address, - int half_module) { // bot_address 0 for half module int parameters_ok = 1; +<<<<<<< Updated upstream unsigned int pre_module_index = 0; if (Feb_Control_GetModuleIndex(module_number, &pre_module_index)) { LOG(logINFO, ("\tRemoving previous assignment of module number %d.\n", @@ -407,19 +348,11 @@ int Feb_Control_AddModule1(unsigned int module_number, int top_enable, parameters_ok = 0; } +======= +>>>>>>> Stashed changes struct Module mod, *m; m = &mod; - - /* if ((half_module)&& (top_address != 1)) -Module_Module(m,module_number,top_address); else if (half_module) -Module_ModuleBottom(m,module_number,top_address);*/ - if ((half_module) && (top_enable)) - Module_Module(m, module_number, top_address); - else if (half_module) - Module_ModuleBottom(m, module_number, bottom_address); - else - Module_Module1(m, module_number, top_address, bottom_address); - + Module_Module(m, module_number, top_address); parameters_ok &= Feb_Control_CheckModuleAddresses(m); if (Module_TopAddressIsValid(m) && Module_BottomAddressIsValid(m)) { diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index 7968e97c6..e11a6fecb 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -5,26 +5,15 @@ struct Module { unsigned int module_number; - int top_address_valid; - unsigned int top_left_address; - unsigned int top_right_address; - int bottom_address_valid; - unsigned int bottom_left_address; - unsigned int bottom_right_address; - - unsigned int idelay_top[4]; // ll,lr,rl,ll - unsigned int idelay_bottom[4]; // ll,lr,rl,ll + unsigned int left_address; + unsigned int right_address; + unsigned int idelay_top[4]; // ll,lr,rl,ll float high_voltage; - int *top_dac; - int *bottom_dac; + int *dac; }; void Module_Module(struct Module *mod, unsigned int number, unsigned int address_top); -void Module_ModuleBottom(struct Module *mod, unsigned int number, - unsigned int address_bottom); -void Module_Module1(struct Module *mod, unsigned int number, - unsigned int address_top, unsigned int address_bottom); unsigned int Module_GetModuleNumber(struct Module *mod); int Module_TopAddressIsValid(struct Module *mod); unsigned int Module_GetTopBaseAddress(struct Module *mod); @@ -59,9 +48,6 @@ int Feb_Control_GetModuleIndex(unsigned int module_number, unsigned int *module_index); int Feb_Control_CheckModuleAddresses(struct Module *m); int Feb_Control_AddModule(unsigned int module_number, unsigned int top_address); -int Feb_Control_AddModule1(unsigned int module_number, int top_enable, - unsigned int top_address, - unsigned int bottom_address, int half_module); int Feb_Control_GetDACNumber(char *s, unsigned int *n); int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, unsigned int *value); From 7c2949f372b6a531630b701ab0099eac7031b915 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Fri, 12 Jun 2020 17:07:58 +0200 Subject: [PATCH 02/28] WIP --- .../eigerDetectorServer/FebControl.c | 103 +++++------------- .../eigerDetectorServer/FebControl.h | 33 ++---- 2 files changed, 36 insertions(+), 100 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 1354f2e4f..b7d6970f0 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -75,80 +75,45 @@ void Module_Module(struct Module *mod, unsigned int number, unsigned int Module_GetModuleNumber(struct Module *mod) { return mod->module_number; } -int Module_TopAddressIsValid(struct Module *mod) { - return mod->top_address_valid; -} -unsigned int Module_GetTopBaseAddress(struct Module *mod) { - return (mod->top_left_address & 0xff); -} -unsigned int Module_GetTopLeftAddress(struct Module *mod) { - return mod->top_left_address; -} -unsigned int Module_GetTopRightAddress(struct Module *mod) { - return mod->top_right_address; -} -unsigned int Module_GetBottomBaseAddress(struct Module *mod) { - return (mod->bottom_left_address & 0xff); -} -int Module_BottomAddressIsValid(struct Module *mod) { - return mod->bottom_address_valid; -} -unsigned int Module_GetBottomLeftAddress(struct Module *mod) { - return mod->bottom_left_address; -} -unsigned int Module_GetBottomRightAddress(struct Module *mod) { - return mod->bottom_right_address; + +unsigned int Module_GetBaseAddress(struct Module *mod) { + return (mod->left_address & 0xff); } -unsigned int Module_SetTopIDelay(struct Module *mod, unsigned int chip, - unsigned int value) { - return Module_TopAddressIsValid(mod) && chip < 4 - ? (mod->idelay_top[chip] = value) - : 0; -} // chip 0=ll,1=lr,0=rl,1=rr -unsigned int Module_GetTopIDelay(struct Module *mod, unsigned int chip) { - return chip < 4 ? mod->idelay_top[chip] : 0; -} // chip 0=ll,1=lr,0=rl,1=rr -unsigned int Module_SetBottomIDelay(struct Module *mod, unsigned int chip, - unsigned int value) { - return Module_BottomAddressIsValid(mod) && chip < 4 - ? (mod->idelay_bottom[chip] = value) - : 0; -} // chip 0=ll,1=lr,0=rl,1=rr -unsigned int Module_GetBottomIDelay(struct Module *mod, unsigned int chip) { - return chip < 4 ? mod->idelay_bottom[chip] : 0; -} // chip 0=ll,1=lr,0=rl,1=rr +unsigned int Module_GetLeftAddress(struct Module *mod) { + return mod->left_address; +} + +unsigned int Module_GetRightAddress(struct Module *mod) { + return mod->right_address; +} + +unsigned int Module_SetIDelay(struct Module *mod, unsigned int chip, + unsigned int value) { + // chip 0=ll,1=lr,0=rl,1=rr + return chip < 4 ? (mod->idelay[chip] = value) : 0; +} + +unsigned int Module_GetIDelay(struct Module *mod, unsigned int chip) { + return chip < 4 ? mod->idelay[chip] : 0; +} float Module_SetHighVoltage(struct Module *mod, float value) { return Feb_control_master ? (mod->high_voltage = value) : -1; -} // Module_TopAddressIsValid(mod) ? (mod->high_voltage=value) : -1;} +} + float Module_GetHighVoltage(struct Module *mod) { return mod->high_voltage; } -int Module_SetTopDACValue(struct Module *mod, unsigned int i, int value) { - return (i < Module_ndacs && Module_TopAddressIsValid(mod)) - ? (mod->top_dac[i] = value) - : -1; +int Module_SetDACValue(struct Module *mod, unsigned int i, int value) { + return (i < Module_ndacs) ? (mod->dac[i] = value) : -1; } -int Module_GetTopDACValue(struct Module *mod, unsigned int i) { - return (i < Module_ndacs) ? mod->top_dac[i] : -1; -} -int Module_SetBottomDACValue(struct Module *mod, unsigned int i, int value) { - return (i < Module_ndacs && Module_BottomAddressIsValid(mod)) - ? (mod->bottom_dac[i] = value) - : -1; -} -int Module_GetBottomDACValue(struct Module *mod, unsigned int i) { - return (i < Module_ndacs) ? mod->bottom_dac[i] : -1; + +int Module_GetDACValue(struct Module *mod, unsigned int i) { + return (i < Module_ndacs) ? mod->dac[i] : -1; } void Feb_Control_activate(int activate) { Feb_Control_activated = activate; } -int Feb_Control_IsBottomModule() { - if (Module_BottomAddressIsValid(&modules[Feb_Control_current_index])) - return 1; - return 0; -} - int Feb_Control_GetModuleNumber() { return Feb_Control_module_number; } void Feb_Control_FebControl() { @@ -336,20 +301,6 @@ int Feb_Control_CheckModuleAddresses(struct Module *m) { int Feb_Control_AddModule(unsigned int module_number, unsigned int top_address) { int parameters_ok = 1; -<<<<<<< Updated upstream - unsigned int pre_module_index = 0; - if (Feb_Control_GetModuleIndex(module_number, &pre_module_index)) { - LOG(logINFO, ("\tRemoving previous assignment of module number %d.\n", - module_number)); - // free(modules[pre_module_index]); - for (int i = pre_module_index; i < moduleSize - 1; i++) - modules[i] = modules[i + 1]; - moduleSize--; - parameters_ok = 0; - } - -======= ->>>>>>> Stashed changes struct Module mod, *m; m = &mod; Module_Module(m, module_number, top_address); diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index e11a6fecb..5ca18884f 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -7,7 +7,7 @@ struct Module { unsigned int module_number; unsigned int left_address; unsigned int right_address; - unsigned int idelay_top[4]; // ll,lr,rl,ll + unsigned int idelay[4]; // ll,lr,rl,ll float high_voltage; int *dac; }; @@ -15,34 +15,19 @@ struct Module { void Module_Module(struct Module *mod, unsigned int number, unsigned int address_top); unsigned int Module_GetModuleNumber(struct Module *mod); -int Module_TopAddressIsValid(struct Module *mod); -unsigned int Module_GetTopBaseAddress(struct Module *mod); -unsigned int Module_GetTopLeftAddress(struct Module *mod); -unsigned int Module_GetTopRightAddress(struct Module *mod); -unsigned int Module_GetBottomBaseAddress(struct Module *mod); -int Module_BottomAddressIsValid(struct Module *mod); -unsigned int Module_GetBottomLeftAddress(struct Module *mod); -unsigned int Module_GetBottomRightAddress(struct Module *mod); -unsigned int Module_SetTopIDelay(struct Module *mod, unsigned int chip, - unsigned int value); -unsigned int Module_GetTopIDelay(struct Module *mod, unsigned int chip); -unsigned int Module_SetBottomIDelay(struct Module *mod, unsigned int chip, - unsigned int value); -unsigned int Module_GetBottomIDelay(struct Module *mod, unsigned int chip); - +unsigned int Module_GetBaseAddress(struct Module *mod); +unsigned int Module_GetLeftAddress(struct Module *mod); +unsigned int Module_GetRightAddress(struct Module *mod); +unsigned int Module_SetIDelay(struct Module *mod, unsigned int chip, + unsigned int value); +unsigned int Module_GetIDelay(struct Module *mod, unsigned int chip); float Module_SetHighVoltage(struct Module *mod, float value); float Module_GetHighVoltage(struct Module *mod); - -int Module_SetTopDACValue(struct Module *mod, unsigned int i, int value); -int Module_GetTopDACValue(struct Module *mod, unsigned int i); -int Module_SetBottomDACValue(struct Module *mod, unsigned int i, int value); -int Module_GetBottomDACValue(struct Module *mod, unsigned int i); +int Module_SetDACValue(struct Module *mod, unsigned int i, int value); +int Module_GetDACValue(struct Module *mod, unsigned int i); void Feb_Control_activate(int activate); - -int Feb_Control_IsBottomModule(); int Feb_Control_GetModuleNumber(); - void Feb_Control_PrintModuleList(); int Feb_Control_GetModuleIndex(unsigned int module_number, unsigned int *module_index); From 24af0ee5782f06744ee16ef261d16f8be9ee06ad Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 10:29:50 +0200 Subject: [PATCH 03/28] WIP --- .../eigerDetectorServer/FebControl.c | 22 +++++-------------- .../eigerDetectorServer/FebControl.h | 2 +- .../slsDetectorFunctionList.c | 4 ++-- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index b7d6970f0..7b7fc7198 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -126,7 +126,7 @@ void Feb_Control_FebControl() { moduleSize = 0; } -int Feb_Control_Init(int master, int top, int normal, int module_num) { +int Feb_Control_Init(int master, int normal, int module_num) { Feb_Control_module_number = 0; Feb_Control_current_index = 0; Feb_control_master = master; @@ -135,28 +135,18 @@ int Feb_Control_Init(int master, int top, int normal, int module_num) { // global send Feb_Control_AddModule(0, 0xff); Feb_Control_PrintModuleList(); - Feb_Control_module_number = (module_num & 0xFF); - - int serial = !top; - LOG(logDEBUG1, ("serial: %d\n", serial)); - - Feb_Control_current_index = 1; // Add the half module - Feb_Control_AddModule(Feb_Control_module_number, serial); + Feb_Control_module_number = (module_num & 0xFF); + Feb_Control_current_index = 1; + Feb_Control_AddModule(Feb_Control_module_number, 0); Feb_Control_PrintModuleList(); unsigned int nfebs = 0; unsigned int *feb_list = malloc(moduleSize * 4 * sizeof(unsigned int)); for (unsigned int i = 1; i < moduleSize; i++) { - if (Module_TopAddressIsValid(&modules[i])) { - feb_list[nfebs++] = Module_GetTopRightAddress(&modules[i]); - feb_list[nfebs++] = Module_GetTopLeftAddress(&modules[i]); - } - if (Module_BottomAddressIsValid(&modules[i])) { - feb_list[nfebs++] = Module_GetBottomRightAddress(&modules[i]); - feb_list[nfebs++] = Module_GetBottomLeftAddress(&modules[i]); - } + feb_list[nfebs++] = Module_GetTopRightAddress(&modules[i]); + feb_list[nfebs++] = Module_GetTopLeftAddress(&modules[i]); } Feb_Interface_SendCompleteList(nfebs, feb_list); diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index 5ca18884f..bd38c4476 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -54,7 +54,7 @@ int Feb_Control_StartDAQOnlyNWaitForFinish(int sleep_time_us); int Feb_Control_ResetChipCompletely(); int Feb_Control_ResetChipPartially(); void Feb_Control_FebControl(); -int Feb_Control_Init(int master, int top, int normal, int module_num); +int Feb_Control_Init(int master, int normal, int module_num); int Feb_Control_OpenSerialCommunication(); void Feb_Control_CloseSerialCommunication(); int Feb_Control_CheckSetup(); diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index cccc0d6c3..b8efc4be0 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -333,7 +333,7 @@ void initControlServer() { Feb_Interface_FebInterface(); Feb_Control_FebControl(); // same addresses for top and bottom - Feb_Control_Init(master, 1, normal, getDetectorNumber()); + Feb_Control_Init(master, normal, getDetectorNumber()); // master of 9M, check high voltage serial communication to blackfin if (master && !normal) { if (Feb_Control_OpenSerialCommunication()) @@ -372,7 +372,7 @@ void initStopServer() { Feb_Interface_FebInterface(); Feb_Control_FebControl(); // same addresses for top and bottom - Feb_Control_Init(master, 1, normal, getDetectorNumber()); + Feb_Control_Init(master, normal, getDetectorNumber()); LOG(logDEBUG1, ("Stop server: FEB Initialization done\n")); #endif // client first connect (from shm) will activate From 3775ff302e20be7b9dbba98381633a2405f35c2a Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 10:36:24 +0200 Subject: [PATCH 04/28] WIP --- slsDetectorServers/eigerDetectorServer/FebControl.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 7b7fc7198..9dc53e9de 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -144,10 +144,8 @@ int Feb_Control_Init(int master, int normal, int module_num) { unsigned int nfebs = 0; unsigned int *feb_list = malloc(moduleSize * 4 * sizeof(unsigned int)); - for (unsigned int i = 1; i < moduleSize; i++) { - feb_list[nfebs++] = Module_GetTopRightAddress(&modules[i]); - feb_list[nfebs++] = Module_GetTopLeftAddress(&modules[i]); - } + feb_list[nfebs++] = Module_GetRightAddress(&modules[1]); + feb_list[nfebs++] = Module_GetLeftAddress(&modules[1]); Feb_Interface_SendCompleteList(nfebs, feb_list); free(feb_list); From 62449b81adf5c1c6389cf8c1541f8942770de90d Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 10:36:59 +0200 Subject: [PATCH 05/28] format --- .../eigerDetectorServer/slsDetectorFunctionList.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 627889ccc..5733743c0 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -34,9 +34,9 @@ int initCheckDone = 0; char initErrorMessage[MAX_STR_LENGTH]; const char *dac_names[16] = {"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", - "VSvN", "Vtgstv", "Vcmp_ll", "Vcmp_lr", - "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", - "Vcmp_rr", "Vcp", "Vcn", "Vishaper"}; + "VSvN", "Vtgstv", "Vcmp_ll", "Vcmp_lr", + "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", + "Vcmp_rr", "Vcp", "Vcn", "Vishaper"}; int default_tau_from_file = -1; enum detectorSettings thisSettings; sls_detector_module *detectorModules = NULL; From 8c9341836b5e26b75c1b89054b21439abc6d1073 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 16:26:26 +0200 Subject: [PATCH 06/28] WIP --- .../eigerDetectorServer/FebControl.c | 1840 +++++++---------- .../eigerDetectorServer/FebControl.h | 146 +- .../eigerDetectorServer/FebInterface.c | 14 +- .../eigerDetectorServer/FebInterface.h | 2 +- .../slsDetectorFunctionList.c | 39 +- 5 files changed, 804 insertions(+), 1237 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 9dc53e9de..403e0355f 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -48,7 +48,6 @@ unsigned int Feb_Control_trimbit_size; unsigned int *Feb_Control_last_downloaded_trimbits; int Feb_Control_module_number; -int Feb_Control_current_index; int Feb_Control_counter_bit = 1; int Feb_control_master = 0; @@ -61,21 +60,21 @@ double ratemax = -1; int Feb_Control_activated = 1; int Feb_Control_hv_fd = -1; -void Module_Module(struct Module *mod, unsigned int number, - unsigned int address_top) { +// module +void Module_Module(struct Module *mod, unsigned int number) { mod->module_number = number; - mod->left_address = 0x100 | (0xff & address_top); - mod->right_address = (0x200 | (0xff & address_top)); + mod->left_address = 0x100; + mod->right_address = (0x200; + if (number == 0u) { + mod->left_address |= 0xff; + mod->right_address |= 0xff; + } mod->high_voltage = -1; mod->dac = malloc(Module_ndacs * sizeof(int)); for (unsigned int i = 0; i < Module_ndacs; i++) mod->dac[i] = 0; } -unsigned int Module_GetModuleNumber(struct Module *mod) { - return mod->module_number; -} - unsigned int Module_GetBaseAddress(struct Module *mod) { return (mod->left_address & 0xff); } @@ -112,6 +111,7 @@ int Module_GetDACValue(struct Module *mod, unsigned int i) { return (i < Module_ndacs) ? mod->dac[i] : -1; } +// setup void Feb_Control_activate(int activate) { Feb_Control_activated = activate; } int Feb_Control_GetModuleNumber() { return Feb_Control_module_number; } @@ -127,37 +127,29 @@ void Feb_Control_FebControl() { } int Feb_Control_Init(int master, int normal, int module_num) { - Feb_Control_module_number = 0; - Feb_Control_current_index = 0; Feb_control_master = master; Feb_control_normal = normal; - // global send - Feb_Control_AddModule(0, 0xff); + // global send (module number 0) + Feb_Control_AddModule(0); Feb_Control_PrintModuleList(); // Add the half module Feb_Control_module_number = (module_num & 0xFF); - Feb_Control_current_index = 1; - Feb_Control_AddModule(Feb_Control_module_number, 0); + Feb_Control_AddModule(Feb_Control_module_number); Feb_Control_PrintModuleList(); - unsigned int nfebs = 0; - unsigned int *feb_list = malloc(moduleSize * 4 * sizeof(unsigned int)); - feb_list[nfebs++] = Module_GetRightAddress(&modules[1]); - feb_list[nfebs++] = Module_GetLeftAddress(&modules[1]); - - Feb_Interface_SendCompleteList(nfebs, feb_list); - free(feb_list); - if (Feb_Control_activated) - Feb_Interface_SetByteOrder(); - + // interface setup + Feb_Interface_SetAddress(Module_GetRightAddress(&modules[1]), + Module_GetLeftAddress(&modules[1])); + if (Feb_Control_activated) { + return Feb_Interface_SetByteOrder(); + } return 1; } int Feb_Control_OpenSerialCommunication() { LOG(logINFO, ("opening serial communication of hv\n")); - // if (Feb_Control_hv_fd != -1) close(Feb_Control_hv_fd); Feb_Control_hv_fd = open(SPECIAL9M_HIGHVOLTAGE_PORT, O_RDWR | O_NOCTTY | O_SYNC); @@ -219,176 +211,101 @@ void Feb_Control_PrintModuleList() { LOG(logDEBUG1, ("Module list:\n")); for (unsigned int i = 0; i < moduleSize; i++) { LOG(logDEBUG1, - ("\t%d) %s modules: %d 0x%x %s\n", i, - ((i == 0) ? "All " : ((i == 1) ? "Master" : " ")), - Module_GetModuleNumber(&modules[i]), - (Module_TopAddressIsValid(&modules[i]) - ? Module_GetTopBaseAddress(&modules[i]) - : Module_GetBottomBaseAddress(&modules[i])), - (Module_TopAddressIsValid(&modules[i]) ? "(top) " - : "(bottom) "))); + ("\t%d) %s\t: [Module Number:%d, Base Address: 0x%x]\n", i, + ((i == 0) ? "Global" : "Half Module"), modules[i]->module_number, + Module_GetBaseAddress(&modules[i]))); } } -int Feb_Control_GetModuleIndex(unsigned int module_number, - unsigned int *module_index) { - for (unsigned int i = 0; i < moduleSize; i++) { - if (Module_GetModuleNumber(&modules[i]) == module_number) { - *module_index = i; - return 1; - } - } - - return 0; -} - -int Feb_Control_CheckModuleAddresses(struct Module *m) { - int found_t = 0; - int found_b = 0; - for (unsigned int i = 0; i < moduleSize; i++) { - if ((Module_TopAddressIsValid(m) && - Module_GetTopBaseAddress(&modules[i]) && - Module_GetTopBaseAddress(m) == - Module_GetTopBaseAddress(&modules[i])) || - (Module_TopAddressIsValid(m) && - Module_GetBottomBaseAddress(&modules[i]) && - Module_GetTopBaseAddress(m) == - Module_GetBottomBaseAddress(&modules[i]))) - found_t = 1; - if ((Module_BottomAddressIsValid(m) && - Module_GetTopBaseAddress(&modules[i]) && - Module_GetBottomBaseAddress(m) == - Module_GetTopBaseAddress(&modules[i])) || - (Module_BottomAddressIsValid(m) && - Module_GetBottomBaseAddress(&modules[i]) && - Module_GetBottomBaseAddress(m) == - Module_GetBottomBaseAddress(&modules[i]))) - found_b = 1; - } - - if (found_t) { - LOG(logERROR, - ("top address %d already used.\n", Module_GetTopBaseAddress(m))); - } - if (found_b) { - LOG(logERROR, ("bottom address %d already used.\n", - Module_GetBottomBaseAddress(m))); - } - - int top_bottom_same = - Module_TopAddressIsValid(m) && Module_BottomAddressIsValid(m) && - Module_GetTopBaseAddress(m) == Module_GetBottomBaseAddress(m); - if (top_bottom_same) { - LOG(logERROR, ("top and bottom address are the same %d.\n", - Module_GetTopBaseAddress(m))); - } - - return !(top_bottom_same || found_t || found_b); -} - -int Feb_Control_AddModule(unsigned int module_number, - unsigned int top_address) { - int parameters_ok = 1; +void Feb_Control_AddModule(unsigned int module_number) { struct Module mod, *m; m = &mod; - Module_Module(m, module_number, top_address); - parameters_ok &= Feb_Control_CheckModuleAddresses(m); + Module_Module(m, module_number); - if (Module_TopAddressIsValid(m) && Module_BottomAddressIsValid(m)) { - LOG(logDEBUG1, ("\tAdding full module number %d with top and bottom " - "base addresses: %d %d\n", - Module_GetModuleNumber(m), Module_GetTopBaseAddress(m), - Module_GetBottomBaseAddress(m))); - modules[moduleSize] = mod; - moduleSize++; - } else if (Module_TopAddressIsValid(m)) { - LOG(logDEBUG1, - ("\tAdding half module number %d with " - "top base address: %d\n", - Module_GetModuleNumber(m), Module_GetTopBaseAddress(m))); - modules[moduleSize] = mod; - moduleSize++; - } else if (Module_BottomAddressIsValid(m)) { - LOG(logDEBUG1, - ("\tAdding half module number %d with " - "bottom base address: %d\n", - Module_GetModuleNumber(m), Module_GetBottomBaseAddress(m))); - modules[moduleSize] = mod; - moduleSize++; - } else { - // free(m); - } - - return parameters_ok; + LOG(logDEBUG1, ("\tAdding half module number %d with " + "top base address: %d\n", + m->module_number, Module_GetBaseAddress(m))); + modules[moduleSize] = mod; + moduleSize++; } int Feb_Control_CheckSetup(int master) { LOG(logDEBUG1, ("Checking Set up\n")); - unsigned int i; - int ok = 1; - - i = Feb_Control_current_index; for (unsigned int j = 0; j < 4; j++) { - if (Module_GetTopIDelay(&modules[i], j) < 0) { - LOG(logERROR, ("module %d's idelay top number %d not set.\n", - Module_GetModuleNumber(&modules[i]), j)); - ok = 0; - } - if (Module_GetBottomIDelay(&modules[i], j) < 0) { - LOG(logERROR, ("module %d's idelay bottom number %d not set.\n", - Module_GetModuleNumber(&modules[i]), j)); - ok = 0; + if (Module_GetIDelay(&modules[1], j) < 0) { + LOG(logERROR, ("idelay chip %d not set.\n", j)); + return 0; } } int value = 0; if ((Feb_control_master) && (!Feb_Control_GetHighVoltage(&value))) { - LOG(logERROR, ("module %d's high voltage not set.\n", - Module_GetModuleNumber(&modules[i]))); - ok = 0; + LOG(logERROR, ("high voltage not set.\n")); + return 0; } for (unsigned int j = 0; j < Module_ndacs; j++) { - if (Module_GetTopDACValue(&modules[i], j) < 0) { - LOG(logERROR, - ("module %d's top \"%s\" dac is not set.\n", - Module_GetModuleNumber(&modules[i]), Module_dac_names[i])); - ok = 0; - } - if (Module_GetBottomDACValue(&modules[i], j) < 0) { - LOG(logERROR, - ("module %d's bottom \"%s\" dac is not set.\n", - Module_GetModuleNumber(&modules[i]), Module_dac_names[i])); - ok = 0; + if (Module_GetDACValue(&modules[1], j) < 0) { + LOG(logERROR, ("\"%s\" dac is not set.\n", Module_dac_names[j])); + return 0; } } - /* }*/ LOG(logDEBUG1, ("Done Checking Set up\n")); - return ok; + return 1; } -unsigned int Feb_Control_GetNModules() { - if (moduleSize <= 0) - return 0; - return moduleSize - 1; +unsigned int Feb_Control_AddressToAll() { + return Module_GetLeftAddress(&modules[1]) | + Module_GetRightAddress(&modules[1]); } -unsigned int Feb_Control_GetNHalfModules() { - unsigned int n_half_modules = 0; - for (unsigned int i = 1; i < moduleSize; i++) { - if (Module_TopAddressIsValid(&modules[i])) - n_half_modules++; - if (Module_BottomAddressIsValid(&modules[i])) - n_half_modules++; +int Feb_Control_SetCommandRegister(unsigned int cmd) { + if (Feb_Control_activated) + return Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), + DAQ_REG_CHIP_CMDS, cmd, 0, 0); + else + return 1; +} + +int Feb_Control_SetStaticBits() { + if (Feb_Control_activated) { + // program=1,m4=2,m8=4,test=8,rotest=16,cs_bar_left=32,cs_bar_right=64 + if (!Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), + DAQ_REG_STATIC_BITS, + Feb_Control_staticBits, 0, 0) || + !Feb_Control_SetCommandRegister(DAQ_SET_STATIC_BIT) || + (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { + LOG(logERROR, ("Could not set static bits\n")); + return 0; + } } - - return n_half_modules; + return 1; } -int Feb_Control_SetIDelays(unsigned int module_num, unsigned int ndelay_units) { - int ret = Feb_Control_SetIDelays1(module_num, 0, ndelay_units) && - Feb_Control_SetIDelays1(module_num, 1, ndelay_units) && - Feb_Control_SetIDelays1(module_num, 2, ndelay_units) && - Feb_Control_SetIDelays1(module_num, 3, ndelay_units); +int Feb_Control_SetStaticBits1(unsigned int the_static_bits) { + Feb_Control_staticBits = the_static_bits; + return Feb_Control_SetStaticBits(); +} + +int Feb_Control_SetInTestModeVariable(int on) { + if (on) + Feb_Control_staticBits |= + DAQ_STATIC_BIT_CHIP_TEST; // setting test bit to high + else + Feb_Control_staticBits &= + (~DAQ_STATIC_BIT_CHIP_TEST); // setting test bit to low + return 1; +} + +int Feb_Control_GetTestModeVariable() { + return Feb_Control_staticBits & DAQ_STATIC_BIT_CHIP_TEST; +} + +// idelay +int Feb_Control_SetIDelays(unsigned int ndelay_units) { + int ret = Feb_Control_SetIDelays1(0, ndelay_units) && + Feb_Control_SetIDelays1(1, ndelay_units) && + Feb_Control_SetIDelays1(2, ndelay_units) && + Feb_Control_SetIDelays1(3, ndelay_units); if (ret) { LOG(logINFO, ("IODelay set to %d\n", ndelay_units)); } @@ -396,107 +313,33 @@ int Feb_Control_SetIDelays(unsigned int module_num, unsigned int ndelay_units) { } int Feb_Control_SetIDelays1( - unsigned int module_num, unsigned int chip_pos, + unsigned int chip_pos, unsigned int ndelay_units) { // chip_pos 0=ll,1=lr,0=rl,1=rr - // currently set same for top and bottom if (chip_pos > 3) { LOG(logERROR, ("SetIDelay chip_pos %d doesn't exist.\n", chip_pos)); return 0; } - unsigned int module_index = 0; - if (!Feb_Control_GetModuleIndex(module_num, &module_index)) { - LOG(logERROR, - ("could not set i delay module number %d invalid.\n", module_num)); - return 0; - } - - int ok = 1; if (chip_pos / 2 == 0) { // left fpga - if (Module_TopAddressIsValid(&modules[module_index])) { - if (Feb_Control_SendIDelays( - Module_GetTopLeftAddress(&modules[module_index]), - chip_pos % 2 == 0, 0xffffffff, ndelay_units)) { - if (module_index != 0) - Module_SetTopIDelay(&modules[module_index], chip_pos, - ndelay_units); - else { - for (unsigned int i = 0; i < moduleSize; i++) - Module_SetTopIDelay(&modules[i], chip_pos, - ndelay_units); - for (unsigned int i = 0; i < moduleSize; i++) - Module_SetBottomIDelay(&modules[i], chip_pos, - ndelay_units); - } - } else { - LOG(logERROR, - ("could not set idelay module number %d (top_left).\n", - module_num)); - ok = 0; - } - } - if (Module_BottomAddressIsValid(&modules[module_index])) { - if (Feb_Control_SendIDelays( - Module_GetBottomLeftAddress(&modules[module_index]), - chip_pos % 2 == 0, 0xffffffff, ndelay_units)) { - if (module_index != 0) - Module_SetBottomIDelay(&modules[module_index], chip_pos, - ndelay_units); - else { - for (unsigned int i = 0; i < moduleSize; i++) - Module_SetTopIDelay(&modules[i], chip_pos, - ndelay_units); - for (unsigned int i = 0; i < moduleSize; i++) - Module_SetBottomIDelay(&modules[i], chip_pos, - ndelay_units); - } - } else { - LOG(logERROR, - ("could not set idelay module number %d (bottom_left).\n", - module_num)); - ok = 0; - } + if (Feb_Control_SendIDelays(Module_GetLeftAddress(&modules[1]), + chip_pos % 2 == 0, 0xffffffff, + ndelay_units)) { + Module_SetIDelay(&modules[1], chip_pos, ndelay_units); + } else { + LOG(logERROR, ("could not set idelay (left).\n")); + return 0; } } else { - if (Module_TopAddressIsValid(&modules[module_index])) { - if (Feb_Control_SendIDelays( - Module_GetTopRightAddress(&modules[module_index]), - chip_pos % 2 == 0, 0xffffffff, ndelay_units)) { - if (module_index != 0) - Module_SetTopIDelay(&modules[module_index], chip_pos, - ndelay_units); - else - for (unsigned int i = 0; i < moduleSize; i++) - Module_SetTopIDelay(&modules[i], chip_pos, - ndelay_units); - } else { - LOG(logERROR, - ("could not set idelay module number %d (top_right).\n", - module_num)); - ok = 0; - } - } - if (Module_BottomAddressIsValid(&modules[module_index])) { - if (Feb_Control_SendIDelays( - Module_GetBottomRightAddress(&modules[module_index]), - chip_pos % 2 == 0, 0xffffffff, ndelay_units)) { - if (module_index != 0) - Module_SetBottomIDelay(&modules[module_index], chip_pos, - ndelay_units); - else - for (unsigned int i = 0; i < moduleSize; i++) - Module_SetBottomIDelay(&modules[i], chip_pos, - ndelay_units); - } else { - LOG(logERROR, - ("could not set idelay module number %d (bottom_right).\n", - module_num)); - ok = 0; - } + if (Feb_Control_SendIDelays(Module_GetRightAddress(&modules[1]), + chip_pos % 2 == 0, 0xffffffff, + ndelay_units)) { + Module_SetIDelay(&modules[1], chip_pos, ndelay_units); + } else { + LOG(logERROR, ("could not set idelay (right).\n")); + return 0; } } - - return ok; + return 1; } int Feb_Control_SendIDelays(unsigned int dst_num, int chip_lr, @@ -534,23 +377,10 @@ int Feb_Control_SendIDelays(unsigned int dst_num, int chip_lr, return 0; } } - return 1; } -int Feb_Control_VoltageToDAC(float value, unsigned int *digital, - unsigned int nsteps, float vmin, float vmax) { - if (value < vmin || value > vmax) - return 0; - *digital = (int)(((value - vmin) / (vmax - vmin)) * (nsteps - 1) + 0.5); - return 1; -} - -float Feb_Control_DACToVoltage(unsigned int digital, unsigned int nsteps, - float vmin, float vmax) { - return vmin + (vmax - vmin) * digital / (nsteps - 1); -} - +// highvoltage // only master gets to call this function int Feb_Control_SetHighVoltage(int value) { LOG(logDEBUG1, (" Setting High Voltage:\t")); @@ -769,32 +599,32 @@ int Feb_Control_ReceiveHighVoltage(unsigned int *value) { return 1; } -int Feb_Control_DecodeDACString(char *dac_str, unsigned int *module_index, - int *top, int *bottom, unsigned int *dac_ch) { - char *local_s = dac_str; - *module_index = Feb_Control_current_index; - *top = 1; // make them both 1 instead of this - *bottom = 1; +// dacs +int Feb_Control_VoltageToDAC(float value, unsigned int *digital, + unsigned int nsteps, float vmin, float vmax) { + if (value < vmin || value > vmax) + return 0; + *digital = (int)(((value - vmin) / (vmax - vmin)) * (nsteps - 1) + 0.5); + return 1; +} - if (Module_BottomAddressIsValid(&modules[*module_index])) - *top = 0; - else - *bottom = 0; +float Feb_Control_DACToVoltage(unsigned int digital, unsigned int nsteps, + float vmin, float vmax) { + return vmin + (vmax - vmin) * digital / (nsteps - 1); +} +int Feb_Control_DecodeDACString(char *dac_str, unsigned int *dac_ch) { *dac_ch = 0; - if (!Feb_Control_GetDACNumber(local_s, dac_ch)) { - LOG(logERROR, ("invalid dac_name: %s (%s)\n", dac_str, local_s)); + if (!Feb_Control_GetDACNumber(dac_str, dac_ch)) { + LOG(logERROR, ("invalid dac_name: %s \n", dac_str)); return 0; } - return 1; } int Feb_Control_SetDAC(char *dac_str, int value, int is_a_voltage_mv) { - unsigned int module_index, dac_ch; - int top, bottom; - if (!Feb_Control_DecodeDACString(dac_str, &module_index, &top, &bottom, - &dac_ch)) + unsigned int dac_ch; + if (!Feb_Control_DecodeDACString(dac_str, &dac_ch)) return 0; unsigned int v = value; @@ -808,48 +638,22 @@ int Feb_Control_SetDAC(char *dac_str, int value, int is_a_voltage_mv) { LOG(logERROR, ("SetDac bad value, %d. The range is 0 to 4095.\n", v)); return 0; } + if (!Feb_Control_SendDACValue(Module_GetRightAddress(&modules[1]), dac_ch, + &v)) + return 0; - if (top && Module_TopAddressIsValid(&modules[module_index])) { - - if (!Feb_Control_SendDACValue( - Module_GetTopRightAddress(&modules[module_index]), dac_ch, &v)) - return 0; - - if (module_index != 0) - Module_SetTopDACValue(&modules[module_index], dac_ch, v); - else - for (unsigned int i = 0; i < moduleSize; i++) - Module_SetTopDACValue(&modules[i], dac_ch, v); - } - - if (bottom && Module_BottomAddressIsValid(&modules[module_index])) { - if (!Feb_Control_SendDACValue( - Module_GetBottomRightAddress(&modules[module_index]), dac_ch, - &v)) - return 0; - if (module_index != 0) - Module_SetBottomDACValue(&modules[module_index], dac_ch, v); - else - for (unsigned int i = 0; i < moduleSize; i++) - Module_SetBottomDACValue(&modules[i], dac_ch, v); - } - + Module_SetDACValue(&modules[1], dac_ch, v); return 1; } int Feb_Control_GetDAC(char *s, int *ret_value, int voltage_mv) { - - unsigned int module_index, dac_ch; - int top, bottom; - if (!Feb_Control_DecodeDACString(s, &module_index, &top, &bottom, &dac_ch)) + unsigned int dac_ch; + if (!Feb_Control_DecodeDACString(s, &dac_ch)) return 0; - *ret_value = top ? Module_GetTopDACValue(&modules[module_index], dac_ch) - : Module_GetBottomDACValue(&modules[module_index], dac_ch); - + *ret_value = Module_GetDACValue(&modules[1], dac_ch); if (voltage_mv) *ret_value = Feb_Control_DACToVoltage(*ret_value, 4096, 0, 2048); - return 1; } @@ -870,7 +674,6 @@ int Feb_Control_GetDACNumber(char *s, unsigned int *n) { return 1; } } - return 0; } @@ -882,8 +685,6 @@ int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, return 0; } - // if (voltage<0) return PowerDownDAC(socket_num,ch); - *value &= 0xfff; unsigned int dac_ic = (ch < 8) ? 1 : 2; unsigned int dac_ch = ch % 8; @@ -906,22 +707,15 @@ int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, return 1; } -int Feb_Control_SetTrimbits(unsigned int module_num, unsigned int *trimbits, - int top) { +int Feb_Control_SetTrimbits(unsigned int *trimbits, int top) { LOG(logINFO, ("Setting Trimbits\n")); - unsigned int trimbits_to_load_l[1024]; unsigned int trimbits_to_load_r[1024]; - unsigned int module_index = 0; - if (!Feb_Control_GetModuleIndex(module_num, &module_index)) { - LOG(logERROR, ("could not set trimbits, bad module number.\n")); - return 0; - } - if (Feb_Control_Reset() == STATUS_ERROR) { LOG(logERROR, ("could not reset DAQ.\n")); } + for (int l_r = 0; l_r < 2; l_r++) { // l_r loop unsigned int disable_chip_mask = l_r ? DAQ_CS_BAR_LEFT : DAQ_CS_BAR_RIGHT; @@ -1037,43 +831,19 @@ int Feb_Control_SetTrimbits(unsigned int module_num, unsigned int *trimbits, } // end supercolumn loop sc } // end row loop - if (Module_TopAddressIsValid(&modules[1])) { - if (Feb_Control_activated) { - if (!Feb_Interface_WriteMemoryInLoops( - Module_GetTopLeftAddress( - &modules[Feb_Control_current_index]), - 0, 0, 1024, trimbits_to_load_l) || - !Feb_Interface_WriteMemoryInLoops( - Module_GetTopRightAddress( - &modules[Feb_Control_current_index]), - 0, 0, 1024, trimbits_to_load_r) || - // if - // (!Feb_Interface_WriteMemory(Module_GetTopLeftAddress(&modules[0]),0,0,1023,trimbits_to_load_r)|| - // !Feb_Interface_WriteMemory(Module_GetTopRightAddress(&modules[0]),0,0,1023,trimbits_to_load_l)|| - (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != - STATUS_IDLE)) { - LOG(logERROR, (" some errror!\n")); - return 0; - } - } - } else { - if (Feb_Control_activated) { - if (!Feb_Interface_WriteMemoryInLoops( - Module_GetBottomLeftAddress( - &modules[Feb_Control_current_index]), - 0, 0, 1024, trimbits_to_load_l) || - !Feb_Interface_WriteMemoryInLoops( - Module_GetBottomRightAddress( - &modules[Feb_Control_current_index]), - 0, 0, 1024, trimbits_to_load_r) || - // if - // (!Feb_Interface_WriteMemory(Module_GetTopLeftAddress(&modules[0]),0,0,1023,trimbits_to_load_r)|| - // !Feb_Interface_WriteMemory(Module_GetTopRightAddress(&modules[0]),0,0,1023,trimbits_to_load_l)|| - (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != - STATUS_IDLE)) { - LOG(logERROR, (" some errror!\n")); - return 0; - } + if (Feb_Control_activated) { + if (!Feb_Interface_WriteMemoryInLoops( + Module_GetLeftAddress( + &modules[Feb_Control_current_index]), + 0, 0, 1024, trimbits_to_load_l) || + !Feb_Interface_WriteMemoryInLoops( + Module_GetRightAddress( + &modules[Feb_Control_current_index]), + 0, 0, 1024, trimbits_to_load_r) || + (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != + STATUS_IDLE)) { + LOG(logERROR, (" some errror in setting trimbits!\n")); + return 0; } } @@ -1086,107 +856,36 @@ int Feb_Control_SetTrimbits(unsigned int module_num, unsigned int *trimbits, return Feb_Control_SetStaticBits(); // send the static bits } +int Feb_Control_SaveAllTrimbitsTo(int value, int top) { + unsigned int chanregs[Feb_Control_trimbit_size]; + for (int i = 0; i < Feb_Control_trimbit_size; i++) + chanregs[i] = value; + return Feb_Control_SetTrimbits(0, chanregs, top); +} + unsigned int *Feb_Control_GetTrimbits() { return Feb_Control_last_downloaded_trimbits; } -unsigned int Feb_Control_AddressToAll() { - LOG(logDEBUG1, ("in Feb_Control_AddressToAll()\n")); - - if (moduleSize == 0) - return 0; - - if (Module_BottomAddressIsValid(&modules[1])) { - // if (Feb_Control_am_i_master) - return Module_GetBottomLeftAddress(&modules[1]) | - Module_GetBottomRightAddress(&modules[1]); - // else return 0; - } - - return Module_GetTopLeftAddress(&modules[1]) | - Module_GetTopRightAddress(&modules[1]); - // return - // Module_GetTopLeftAddress(&modules[0])|Module_GetTopRightAddress(&modules[0]); -} - -int Feb_Control_SetCommandRegister(unsigned int cmd) { - if (Feb_Control_activated) - return Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), - DAQ_REG_CHIP_CMDS, cmd, 0, 0); - else - return 1; -} - -int Feb_Control_GetDAQStatusRegister(unsigned int dst_address, - unsigned int *ret_status) { - // if deactivated, should be handled earlier and should not get into this - // function - if (Feb_Control_activated) { - if (!Feb_Interface_ReadRegister(dst_address, DAQ_REG_STATUS, - ret_status)) { - LOG(logERROR, ("Error: reading status register.\n")); - return 0; - } - } - - *ret_status = (0x02FF0000 & *ret_status) >> 16; - return 1; -} - -int Feb_Control_StartDAQOnlyNWaitForFinish(int sleep_time_us) { - if (Feb_Control_activated) { - if (!Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), - DAQ_REG_CTRL, 0, 0, 0) || - !Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), - DAQ_REG_CTRL, DAQ_CTRL_START, 0, 0)) { - LOG(logERROR, ("could not start.\n")); - return 0; - } - } - return Feb_Control_WaitForFinishedFlag(sleep_time_us); -} - int Feb_Control_AcquisitionInProgress() { unsigned int status_reg_r = 0, status_reg_l = 0; - // deactivated should return end of acquisition if (!Feb_Control_activated) return STATUS_IDLE; - int ind = Feb_Control_current_index; - if (Module_BottomAddressIsValid(&modules[ind])) { - - if (!(Feb_Control_GetDAQStatusRegister( - Module_GetBottomRightAddress(&modules[ind]), &status_reg_r))) { - LOG(logERROR, ("Error: Trouble reading Status register. bottom " - "right address\n")); - return STATUS_ERROR; - } - if (!(Feb_Control_GetDAQStatusRegister( - Module_GetBottomLeftAddress(&modules[ind]), &status_reg_l))) { - LOG(logERROR, ("Error: Trouble reading Status register. bottom " - "left address\n")); - return STATUS_ERROR; - } - - } else { - if (!(Feb_Control_GetDAQStatusRegister( - Module_GetTopRightAddress(&modules[ind]), &status_reg_r))) { - LOG(logERROR, ("Error: Trouble reading Status register. top right " - "address\n")); - return STATUS_ERROR; - } - if (!(Feb_Control_GetDAQStatusRegister( - Module_GetTopLeftAddress(&modules[ind]), &status_reg_l))) { - LOG(logERROR, - ("Error: Trouble reading Status register. top left address\n")); - return STATUS_ERROR; - } + if (!(Feb_Control_GetDAQStatusRegister(Module_GetRightAddress(&modules[1]), + &status_reg_r))) { + LOG(logERROR, ("Error: Trouble reading Status register (right)" + "address\n")); + return STATUS_ERROR; + } + if (!(Feb_Control_GetDAQStatusRegister(Module_GetLeftAddress(&modules[1]), + &status_reg_l))) { + LOG(logERROR, ("Error: Trouble reading Status register (left)\n")); + return STATUS_ERROR; } - // running if ((status_reg_r | status_reg_l) & DAQ_STATUS_DAQ_RUNNING) { - LOG(logDEBUG1, ("**runningggg\n")); return STATUS_RUNNING; } // idle @@ -1195,49 +894,48 @@ int Feb_Control_AcquisitionInProgress() { int Feb_Control_AcquisitionStartedBit() { unsigned int status_reg_r = 0, status_reg_l = 0; - // deactivated should return acquisition started/ready if (!Feb_Control_activated) return 1; - int ind = Feb_Control_current_index; - if (Module_BottomAddressIsValid(&modules[ind])) { - - if (!(Feb_Control_GetDAQStatusRegister( - Module_GetBottomRightAddress(&modules[ind]), &status_reg_r))) { - LOG(logERROR, ("Error: Trouble reading Status register. bottom " - "right address\n")); - return -1; - } - if (!(Feb_Control_GetDAQStatusRegister( - Module_GetBottomLeftAddress(&modules[ind]), &status_reg_l))) { - LOG(logERROR, ("Error: Trouble reading Status register. bottom " - "left address\n")); - return -1; - } - - } else { - if (!(Feb_Control_GetDAQStatusRegister( - Module_GetTopRightAddress(&modules[ind]), &status_reg_r))) { - LOG(logERROR, ("Error: Trouble reading Status register. top right " - "address\n")); - return -1; - } - if (!(Feb_Control_GetDAQStatusRegister( - Module_GetTopLeftAddress(&modules[ind]), &status_reg_l))) { - LOG(logERROR, - ("Error: Trouble reading Status register. top left address\n")); - return -1; - } + if (!(Feb_Control_GetDAQStatusRegister(Module_GetRightAddress(&modules[1]), + &status_reg_r))) { + LOG(logERROR, ("Error: Trouble reading Status register (right)\n")); + return -1; + } + if (!(Feb_Control_GetDAQStatusRegister(Module_GetLeftAddress(&modules[1]), + &status_reg_l))) { + LOG(logERROR, ("Error: Trouble reading Status register (left)\n")); + return -1; } - // doesnt mean it started, just the bit if ((status_reg_r | status_reg_l) & DAQ_STATUS_DAQ_RUN_TOGGLE) return 1; - return 0; } +int Feb_Control_WaitForStartedFlag(int sleep_time_us, int prev_flag) { + // deactivated dont wait (otherwise give a toggle value back) + if (!Feb_Control_activated) + return 1; + + // did not start + if (prev_flag == -1) + return 0; + + int value = prev_flag; + while (value == prev_flag) { + usleep(sleep_time_us); + value = Feb_Control_AcquisitionStartedBit(); + } + + // did not start + if (value == -1) + return 0; + + return 1; +} + int Feb_Control_WaitForFinishedFlag(int sleep_time_us) { int is_running = Feb_Control_AcquisitionInProgress(); @@ -1258,33 +956,37 @@ int Feb_Control_WaitForFinishedFlag(int sleep_time_us) { else check_error = 0; } - return is_running; } -int Feb_Control_WaitForStartedFlag(int sleep_time_us, int prev_flag) { - - // deactivated dont wait (otherwise give a toggle value back) - if (!Feb_Control_activated) - return 1; - - // did not start - if (prev_flag == -1) - return 0; - - int value = prev_flag; - while (value == prev_flag) { - usleep(sleep_time_us); - value = Feb_Control_AcquisitionStartedBit(); +int Feb_Control_GetDAQStatusRegister(unsigned int dst_address, + unsigned int *ret_status) { + // if deactivated, should be handled earlier and should not get into this + // function + if (Feb_Control_activated) { + if (!Feb_Interface_ReadRegister(dst_address, DAQ_REG_STATUS, + ret_status)) { + LOG(logERROR, ("Error: reading status register.\n")); + return 0; + } } - - // did not start - if (value == -1) - return 0; - + *ret_status = (0x02FF0000 & *ret_status) >> 16; return 1; } +int Feb_Control_StartDAQOnlyNWaitForFinish(int sleep_time_us) { + if (Feb_Control_activated) { + if (!Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), + DAQ_REG_CTRL, 0, 0, 0) || + !Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), + DAQ_REG_CTRL, DAQ_CTRL_START, 0, 0)) { + LOG(logERROR, ("could not start.\n")); + return 0; + } + } + return Feb_Control_WaitForFinishedFlag(sleep_time_us); +} + int Feb_Control_Reset() { LOG(logINFO, ("Reset daq\n")); if (Feb_Control_activated) { @@ -1298,44 +1000,201 @@ int Feb_Control_Reset() { return 0; } } - return Feb_Control_WaitForFinishedFlag(5000); } -int Feb_Control_SetStaticBits() { +int Feb_Control_ResetChipCompletely() { + if (!Feb_Control_SetCommandRegister(DAQ_RESET_COMPLETELY) || + (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { + LOG(logERROR, ("could not ResetChipCompletely() with 0x%x.\n", + DAQ_RESET_COMPLETELY)); + return 0; + } + LOG(logINFO, ("Chip reset completely\n")); + return 1; +} + +int Feb_Control_ResetChipPartially() { + if (!Feb_Control_SetCommandRegister(DAQ_RESET_PERIPHERY) || + (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { + LOG(logERROR, ("could not ResetChipPartially with periphery\n")); + return 0; + } + LOG(logINFO, ("Chip reset periphery 0x%x\n", DAQ_RESET_PERIPHERY)); + + if (!Feb_Control_SetCommandRegister(DAQ_RESET_COLUMN_SELECT) || + (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { + LOG(logERROR, ("could not ResetChipPartially with column select\n")); + return 0; + } + LOG(logINFO, ("Chip reset column select 0x%x\n", DAQ_RESET_COLUMN_SELECT)); + return 1; +} + +int Feb_Control_SendBitModeToBebServer() { + unsigned int just_bit_mode = + (DAQ_STATIC_BIT_M4 | DAQ_STATIC_BIT_M8) & Feb_Control_staticBits; + unsigned int bit_mode = 16; // default + if (just_bit_mode == DAQ_STATIC_BIT_M4) + bit_mode = 4; + else if (just_bit_mode == DAQ_STATIC_BIT_M8) + bit_mode = 8; + else if (Feb_Control_subFrameMode & + DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING) + bit_mode = 32; + + if (!Beb_SetUpTransferParameters(bit_mode)) { + LOG(logERROR, ("Error: sending bit mode to beb\n")); + return 0; + } + return 1; +} + +unsigned int Feb_Control_ConvertTimeToRegister(float time_in_sec) { + float n_clk_cycles = + round(time_in_sec / 10e-9); // 200 MHz ctb clk or 100 MHz feb clk + + unsigned int decoded_time; + if (n_clk_cycles > (pow(2, 29) - 1) * pow(10, 7)) { + float max_time = 10e-9 * (pow(2, 28) - 1) * pow(10, 7); + LOG(logERROR, ("time exceeds (%f) maximum exposure time of %f sec.\n", + time_in_sec, max_time)); + LOG(logINFO, ("\t Setting to maximum %f us.\n", max_time)); + decoded_time = 0xffffffff; + } else { + int power_of_ten = 0; + while (n_clk_cycles > pow(2, 29) - 1) { + power_of_ten++; + n_clk_cycles = round(n_clk_cycles / 10.0); + } + decoded_time = (int)(n_clk_cycles) << 3 | (int)(power_of_ten); + } + return decoded_time; +} + +int Feb_Control_PrepareForAcquisition() { + LOG(logINFOBLUE, ("Preparing for Acquisition\n")); + Feb_Control_PrintAcquisitionSetup(); + + if (Feb_Control_Reset() == STATUS_ERROR) { + LOG(logERROR, ("Trouble reseting daq or data stream\n")); + return 0; + } + + if (!Feb_Control_SetStaticBits1(Feb_Control_staticBits & + (DAQ_STATIC_BIT_M4 | DAQ_STATIC_BIT_M8))) { + LOG(logERROR, ("Trouble setting static bits\n")); + return 0; + } + + if (!Feb_Control_SendBitModeToBebServer()) { + LOG(logERROR, ("Trouble sending static bits to server\n")); + return 0; + } + + int ret = 0; + if (Feb_Control_counter_bit) + ret = Feb_Control_ResetChipCompletely(); + else + ret = Feb_Control_ResetChipPartially(); + if (!ret) { + LOG(logERROR, ("Trouble resetting chips\n")); + return 0; + } + + unsigned int reg_nums[7]; + unsigned int reg_vals[7]; + reg_nums[0] = DAQ_REG_CTRL; + reg_vals[0] = 0; + reg_nums[1] = DAQ_REG_NEXPOSURES; + reg_vals[1] = Feb_Control_nimages; + reg_nums[2] = DAQ_REG_EXPOSURE_TIMER; + reg_vals[2] = + Feb_Control_ConvertTimeToRegister(Feb_Control_exposure_time_in_sec); + reg_nums[3] = DAQ_REG_EXPOSURE_REPEAT_TIMER; + reg_vals[3] = + Feb_Control_ConvertTimeToRegister(Feb_Control_exposure_period_in_sec); + reg_nums[4] = DAQ_REG_CHIP_CMDS; + reg_vals[4] = (Feb_Control_acquireNReadoutMode | Feb_Control_triggerMode | + Feb_Control_externalEnableMode | Feb_Control_subFrameMode); + reg_nums[5] = DAQ_REG_SUBFRAME_EXPOSURES; + reg_vals[5] = Feb_Control_subframe_exposure_time_in_10nsec; + reg_nums[6] = DAQ_REG_SUBFRAME_PERIOD; + reg_vals[6] = Feb_Control_subframe_period_in_10nsec; if (Feb_Control_activated) { - // program=1,m4=2,m8=4,test=8,rotest=16,cs_bar_left=32,cs_bar_right=64 - if (!Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), - DAQ_REG_STATIC_BITS, - Feb_Control_staticBits, 0, 0) || - !Feb_Control_SetCommandRegister(DAQ_SET_STATIC_BIT) || - (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { - LOG(logERROR, ("Could not set static bits\n")); + if (!Feb_Interface_WriteRegisters(Feb_Control_AddressToAll(), 7, + reg_nums, reg_vals, 0, 0)) { + LOG(logERROR, ("Trouble starting acquisition\n")); return 0; } } - - return 1; -} -int Feb_Control_SetStaticBits1(unsigned int the_static_bits) { - Feb_Control_staticBits = the_static_bits; - return Feb_Control_SetStaticBits(); -} - -int Feb_Control_SetInTestModeVariable(int on) { - if (on) - Feb_Control_staticBits |= - DAQ_STATIC_BIT_CHIP_TEST; // setting test bit to high - else - Feb_Control_staticBits &= - (~DAQ_STATIC_BIT_CHIP_TEST); // setting test bit to low return 1; } -int Feb_Control_GetTestModeVariable() { - return Feb_Control_staticBits & DAQ_STATIC_BIT_CHIP_TEST; +void Feb_Control_PrintAcquisitionSetup() { + time_t rawtime; + time(&rawtime); + struct tm *timeinfo = localtime(&rawtime); + LOG(logINFO, + ("Starting an exposure: (%s)" + "\t Dynamic range nbits: %d\n" + "\t Trigger mode: 0x%x\n" + "\t Number of exposures: %d\n" + "\t Exsposure time (if used): %f seconds.\n" + "\t Exsposure period (if used): %f seconds.\n\n", + asctime(timeinfo), Feb_Control_GetDynamicRange(), + Feb_Control_triggerMode, Feb_Control_GetNExposures(), + Feb_Control_exposure_time_in_sec, Feb_Control_exposure_period_in_sec)); } +int Feb_Control_StartAcquisition() { + LOG(logINFOBLUE, ("Starting Acquisition\n")); + unsigned int reg_nums[15]; + unsigned int reg_vals[15]; + for (int i = 0; i < 14; i++) { + reg_nums[i] = DAQ_REG_CTRL; + reg_vals[i] = 0; + } + reg_nums[14] = DAQ_REG_CTRL; + reg_vals[14] = ACQ_CTRL_START; + if (Feb_Control_activated) { + if (!Feb_Interface_WriteRegisters(Feb_Control_AddressToAll(), 15, + reg_nums, reg_vals, 0, 0)) { + LOG(logERROR, ("Trouble starting acquisition\n")); + return 0; + } + } + return 1; +} + +int Feb_Control_StopAcquisition() { return Feb_Control_Reset(); } + +int Feb_Control_SoftwareTrigger() { + unsigned int orig_value = 0; + Feb_Interface_ReadRegister(Feb_Control_AddressToAll(), DAQ_REG_CHIP_CMDS, + &orig_value); + unsigned int cmd = orig_value | DAQ_REG_CHIP_CMDS_INT_TRIGGER; + if (Feb_Control_activated) { + // set trigger bit + LOG(logDEBUG1, ("Setting Trigger, Register:0x%x\n", cmd)); + if (!Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), + DAQ_REG_CHIP_CMDS, cmd, 0, 0)) { + LOG(logERROR, ("Could not give software trigger\n")); + return 0; + } + // unset trigger bit + LOG(logDEBUG1, ("Unsetting Trigger, Register:0x%x\n", orig_value)); + if (!Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), + DAQ_REG_CHIP_CMDS, orig_value, 0, 0)) { + LOG(logERROR, ("Could not give software trigger\n")); + return 0; + } + LOG(logINFO, ("Software Internal Trigger Sent!\n")); + } + return 1; +} + +// parameters int Feb_Control_SetDynamicRange(unsigned int four_eight_sixteen_or_thirtytwo) { static unsigned int everything_but_bit_mode = DAQ_STATIC_BIT_PROGRAM | DAQ_STATIC_BIT_CHIP_TEST | @@ -1381,8 +1240,8 @@ unsigned int Feb_Control_GetDynamicRange() { return 16; } -int Feb_Control_SetReadoutSpeed( - unsigned int readout_speed) { // 0->full,1->half,2->quarter or 3->super_slow +int Feb_Control_SetReadoutSpeed(unsigned int readout_speed) { + // 0->full,1->half,2->quarter or 3->super_slow Feb_Control_acquireNReadoutMode &= (~DAQ_CHIP_CONTROLLER_SUPER_SLOW_SPEED); if (readout_speed == 1) { Feb_Control_acquireNReadoutMode |= DAQ_CHIP_CONTROLLER_HALF_SPEED; @@ -1400,12 +1259,11 @@ int Feb_Control_SetReadoutSpeed( } LOG(logINFO, ("Speed set to full speed (100 MHz)\n")); } - return 1; } -int Feb_Control_SetReadoutMode( - unsigned int readout_mode) { // 0->parallel,1->non-parallel,2-> safe_mode +int Feb_Control_SetReadoutMode(unsigned int readout_mode) { + // 0->parallel,1->non-parallel,2-> safe_mode Feb_Control_acquireNReadoutMode &= (~DAQ_NEXPOSURERS_PARALLEL_MODE); if (readout_mode == 1) { Feb_Control_acquireNReadoutMode |= @@ -1431,7 +1289,7 @@ int Feb_Control_SetReadoutMode( return 1; } -int Feb_Control_SetTriggerMode(unsigned int trigger_mode, int polarity) { +int Feb_Control_SetTriggerMode(unsigned int trigger_mode) { //"00"-> internal exposure time and period, //"01"-> external acquistion start and internal exposure time and period, //"10"-> external start trigger and internal exposure time, @@ -1457,7 +1315,8 @@ int Feb_Control_SetTriggerMode(unsigned int trigger_mode, int polarity) { LOG(logINFO, ("Trigger mode set to Auto\n")); return trigger_mode == 0; } - + // polarity + int polarity = 1; // hard coded (can be configured in future) if (polarity) { Feb_Control_triggerMode |= DAQ_NEXPOSURERS_EXTERNAL_TRIGGER_POLARITY; LOG(logINFO, ("External trigger polarity set to positive\n")); @@ -1465,7 +1324,6 @@ int Feb_Control_SetTriggerMode(unsigned int trigger_mode, int polarity) { Feb_Control_triggerMode &= (~DAQ_NEXPOSURERS_EXTERNAL_TRIGGER_POLARITY); LOG(logINFO, ("External trigger polarity set to negitive\n")); } - return 1; } @@ -1483,12 +1341,9 @@ int Feb_Control_SetExternalEnableMode(int use_external_enable, int polarity) { (polarity ? "positive" : "negative"))); } else { - Feb_Control_externalEnableMode = - 0; /* changed by Dhanya according to old code &= - (~DAQ_NEXPOSURERS_EXTERNAL_ENABLING);*/ + Feb_Control_externalEnableMode = 0; LOG(logINFO, ("External enabling disabled\n")); } - return 1; } @@ -1497,7 +1352,6 @@ int Feb_Control_SetNExposures(unsigned int n_images) { LOG(logERROR, ("nimages must be greater than zero.%d\n", n_images)); return 0; } - Feb_Control_nimages = n_images; LOG(logDEBUG1, ("Number of images set to %d\n", Feb_Control_nimages)); return 1; @@ -1510,9 +1364,11 @@ int Feb_Control_SetExposureTime(double the_exposure_time_in_sec) { ("Exposure time set to %fs\n", Feb_Control_exposure_time_in_sec)); return 1; } + double Feb_Control_GetExposureTime() { return Feb_Control_exposure_time_in_sec; } + int64_t Feb_Control_GetExposureTime_in_nsec() { return (int64_t)(Feb_Control_exposure_time_in_sec * (1E9)); } @@ -1526,6 +1382,7 @@ int Feb_Control_SetSubFrameExposureTime( (long long int)Feb_Control_subframe_exposure_time_in_10nsec * 10)); return 1; } + int64_t Feb_Control_GetSubFrameExposureTime() { return Feb_Control_subframe_exposure_time_in_10nsec * 10; } @@ -1550,205 +1407,280 @@ double Feb_Control_GetExposurePeriod() { return Feb_Control_exposure_period_in_sec; } -unsigned int Feb_Control_ConvertTimeToRegister(float time_in_sec) { - float n_clk_cycles = - round(time_in_sec / 10e-9); // 200 MHz ctb clk or 100 MHz feb clk - - unsigned int decoded_time; - if (n_clk_cycles > (pow(2, 29) - 1) * pow(10, 7)) { - float max_time = 10e-9 * (pow(2, 28) - 1) * pow(10, 7); - LOG(logERROR, ("time exceeds (%f) maximum exposure time of %f sec.\n", - time_in_sec, max_time)); - LOG(logINFO, ("\t Setting to maximum %f us.\n", max_time)); - decoded_time = 0xffffffff; - } else { - int power_of_ten = 0; - while (n_clk_cycles > pow(2, 29) - 1) { - power_of_ten++; - n_clk_cycles = round(n_clk_cycles / 10.0); - } - decoded_time = (int)(n_clk_cycles) << 3 | (int)(power_of_ten); - } - - return decoded_time; -} - -int Feb_Control_ResetChipCompletely() { - if (!Feb_Control_SetCommandRegister(DAQ_RESET_COMPLETELY) || - (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { - LOG(logERROR, ("could not ResetChipCompletely() with 0x%x.\n", - DAQ_RESET_COMPLETELY)); - return 0; - } - LOG(logINFO, ("Chip reset completely\n")); - return 1; -} - -int Feb_Control_ResetChipPartially() { - if (!Feb_Control_SetCommandRegister(DAQ_RESET_PERIPHERY) || - (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { - LOG(logERROR, ("could not ResetChipPartially with periphery\n")); - return 0; - } - LOG(logINFO, ("Chip reset periphery 0x%x\n", DAQ_RESET_PERIPHERY)); - - if (!Feb_Control_SetCommandRegister(DAQ_RESET_COLUMN_SELECT) || - (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { - LOG(logERROR, ("could not ResetChipPartially with column select\n")); - return 0; - } - LOG(logINFO, ("Chip reset column select 0x%x\n", DAQ_RESET_COLUMN_SELECT)); - - return 1; -} - -void Feb_Control_PrintAcquisitionSetup() { - - time_t rawtime; - time(&rawtime); - struct tm *timeinfo = localtime(&rawtime); - - LOG(logINFO, - ("Starting an exposure: (%s)" - "\t Dynamic range nbits: %d\n" - "\t Trigger mode: 0x%x\n" - "\t Number of exposures: %d\n" - "\t Exsposure time (if used): %f seconds.\n" - "\t Exsposure period (if used): %f seconds.\n\n", - asctime(timeinfo), Feb_Control_GetDynamicRange(), - Feb_Control_triggerMode, Feb_Control_GetNExposures(), - Feb_Control_exposure_time_in_sec, Feb_Control_exposure_period_in_sec)); -} - -int Feb_Control_SendBitModeToBebServer() { - - unsigned int just_bit_mode = - (DAQ_STATIC_BIT_M4 | DAQ_STATIC_BIT_M8) & Feb_Control_staticBits; - unsigned int bit_mode = 16; // default - if (just_bit_mode == DAQ_STATIC_BIT_M4) - bit_mode = 4; - else if (just_bit_mode == DAQ_STATIC_BIT_M8) - bit_mode = 8; - else if (Feb_Control_subFrameMode & - DAQ_NEXPOSURERS_ACTIVATE_AUTO_SUBIMAGING) - bit_mode = 32; - - if (!Beb_SetUpTransferParameters(bit_mode)) { - LOG(logERROR, ("Error: sending bit mode ...\n")); - return 0; - } - - return 1; -} - -int Feb_Control_PrepareForAcquisition() { // return 1; - LOG(logINFO, ("Going to Prepare for Acquisition\n\n\n")); - static unsigned int reg_nums[20]; - static unsigned int reg_vals[20]; - - Feb_Control_PrintAcquisitionSetup(); - - // if (!Reset()||!ResetDataStream()) { - if (Feb_Control_Reset() == STATUS_ERROR) { - LOG(logERROR, ("Trouble reseting daq or data stream...\n")); - return 0; - } - - if (!Feb_Control_SetStaticBits1(Feb_Control_staticBits & - (DAQ_STATIC_BIT_M4 | DAQ_STATIC_BIT_M8))) { - LOG(logERROR, ("Trouble setting static bits ...\n")); - return 0; - } - - if (!Feb_Control_SendBitModeToBebServer()) { - LOG(logERROR, ("Trouble sending static bits to server ...\n")); - return 0; - } - - int ret = 0; - if (Feb_Control_counter_bit) - ret = Feb_Control_ResetChipCompletely(); - else - ret = Feb_Control_ResetChipPartially(); - if (!ret) { - LOG(logERROR, ("Trouble resetting chips ...\n")); - return 0; - } - - reg_nums[0] = DAQ_REG_CTRL; - reg_vals[0] = 0; - reg_nums[1] = DAQ_REG_NEXPOSURES; - reg_vals[1] = Feb_Control_nimages; - reg_nums[2] = DAQ_REG_EXPOSURE_TIMER; - reg_vals[2] = - Feb_Control_ConvertTimeToRegister(Feb_Control_exposure_time_in_sec); - reg_nums[3] = DAQ_REG_EXPOSURE_REPEAT_TIMER; - reg_vals[3] = - Feb_Control_ConvertTimeToRegister(Feb_Control_exposure_period_in_sec); - reg_nums[4] = DAQ_REG_CHIP_CMDS; - reg_vals[4] = (Feb_Control_acquireNReadoutMode | Feb_Control_triggerMode | - Feb_Control_externalEnableMode | Feb_Control_subFrameMode); - reg_nums[5] = DAQ_REG_SUBFRAME_EXPOSURES; - reg_vals[5] = - Feb_Control_subframe_exposure_time_in_10nsec; //(1 means 10ns, 100 means - // 1000ns) - reg_nums[6] = DAQ_REG_SUBFRAME_PERIOD; - reg_vals[6] = Feb_Control_subframe_period_in_10nsec; //(1 means 10ns, 100 - // means 1000ns) - // if - // (!Feb_Interface_WriteRegisters((Module_GetTopLeftAddress(&modules[1])|Module_GetTopRightAddress(&modules[1])),20,reg_nums,reg_vals,0,0)) - // { - if (Feb_Control_activated) { - if (!Feb_Interface_WriteRegisters(Feb_Control_AddressToAll(), 7, - reg_nums, reg_vals, 0, 0)) { - LOG(logERROR, ("Trouble starting acquisition....\n")); - return 0; - } - } - - return 1; -} - -int Feb_Control_StartAcquisition() { - LOG(logINFOBLUE, ("Starting Acquisition\n")); - - static unsigned int reg_nums[20]; - static unsigned int reg_vals[20]; - - for (int i = 0; i < 14; i++) { - reg_nums[i] = DAQ_REG_CTRL; - reg_vals[i] = 0; - } - reg_nums[14] = DAQ_REG_CTRL; - reg_vals[14] = ACQ_CTRL_START; - - if (Feb_Control_activated) { - if (!Feb_Interface_WriteRegisters(Feb_Control_AddressToAll(), 15, - reg_nums, reg_vals, 0, 0)) { - LOG(logERROR, ("Trouble starting acquisition....\n")); - return 0; - } - } - - return 1; -} - -int Feb_Control_StopAcquisition() { return Feb_Control_Reset(); } - -int Feb_Control_SaveAllTrimbitsTo(int value, int top) { - unsigned int chanregs[Feb_Control_trimbit_size]; - for (int i = 0; i < Feb_Control_trimbit_size; i++) - chanregs[i] = value; - return Feb_Control_SetTrimbits(0, chanregs, top); -} - void Feb_Control_Set_Counter_Bit(int value) { Feb_Control_counter_bit = value; } int Feb_Control_Get_Counter_Bit() { return Feb_Control_counter_bit; } +int Feb_Control_SetInterruptSubframe(int val) { + LOG(logINFO, ("Setting Interrupt Subframe to %d\n", val)); + // they need to be written separately because the left and right registers + // have different values for this particular register + uint32_t offset = DAQ_REG_HRDWRE; + uint32_t regVal = 0; + char side[2][10] = {"right", "left"}; + unsigned int addr[2] = {Module_GetRightAddress(&modules[1]), + Module_GetLeftAddress(&modules[1])}; + for (int iloop = 0; iloop < 2; ++iloop) { + // get previous value to keep it + if (!Feb_Interface_ReadRegister(addr[iloop], offset, ®Val)) { + LOG(logERROR, + ("Could not read %s interrupt subframe\n", side[iloop])); + return 0; + } + uint32_t data = ((val == 0) ? (regVal & ~DAQ_REG_HRDWRE_INTRRPT_SF_MSK) + : (regVal | DAQ_REG_HRDWRE_INTRRPT_SF_MSK)); + if (!Feb_Interface_WriteRegister(addr[iloop], offset, data, 0, 0)) { + LOG(logERROR, + ("Could not write 0x%x to %s interrupt subframe addr 0x%x\n", + data, side[iloop], offset)); + return 0; + } + } + return 1; +} + +int Feb_Control_GetInterruptSubframe() { + // they need to be written separately because the left and right registers + // have different values for this particular register + uint32_t offset = DAQ_REG_HRDWRE; + uint32_t regVal = 0; + + char side[2][10] = {"right", "left"}; + unsigned int addr[2] = {Module_GetRightAddress(&modules[1]), + Module_GetLeftAddress(&modules[1])}; + uint32_t value[2] = {0, 0}; + for (int iloop = 0; iloop < 2; ++iloop) { + if (!Feb_Interface_ReadRegister(addr[iloop], offset, ®Val)) { + LOG(logERROR, + ("Could not read back %s interrupt subframe\n", side[iloop])); + return -1; + } + value[iloop] = (regVal & DAQ_REG_HRDWRE_INTRRPT_SF_MSK) >> + DAQ_REG_HRDWRE_INTRRPT_SF_OFST; + } + // inconsistent + if (value[0] != value[1]) { + LOG(logERROR, ("Inconsistent values of interrupt subframe betweeen " + "left %d and right %d\n", + value[0], value[1])); + return -1; + } + return value[0]; +} + +int Feb_Control_SetTop(enum TOPINDEX ind, int left, int right) { + uint32_t offset = DAQ_REG_HRDWRE; + unsigned int addr[2] = {0, 0}; + if (left) { + addr[0] = Module_GetLeftAddress(&modules[1]); + } + if (right) { + addr[1] = Module_GetRightAddress(&modules[1]); + } + char *top_names[] = {TOP_NAMES}; + for (int i = 0; i < 2; ++i) { + if (addr[i] == 0) { + continue; + } + uint32_t value = 0; + if (!Feb_Interface_ReadRegister(addr[i], offset, &value)) { + LOG(logERROR, ("Could not read %s Feb reg to set Top flag\n", + (i == 0 ? "left" : "right"))); + return 0; + } + switch (ind) { + case TOP_HARDWARE: + value &= ~DAQ_REG_HRDWRE_OW_TOP_MSK; + break; + case OW_TOP: + value |= DAQ_REG_HRDWRE_OW_TOP_MSK; + value |= DAQ_REG_HRDWRE_TOP_MSK; + break; + case OW_BOTTOM: + value |= DAQ_REG_HRDWRE_OW_TOP_MSK; + value &= ~DAQ_REG_HRDWRE_TOP_MSK; + break; + default: + LOG(logERROR, ("Unknown top index in Feb: %d\n", ind)); + return 0; + } + if (!Feb_Interface_WriteRegister(addr[i], offset, value, 0, 0)) { + LOG(logERROR, ("Could not set Top flag to %s in %s Feb\n", + top_names[ind], (i == 0 ? "left" : "right"))); + return 0; + } + } + if (left && right) { + LOG(logINFOBLUE, ("%s Top flag to %s Feb\n", + (ind == TOP_HARDWARE ? "Resetting" : "Overwriting"), + top_names[ind])); + } + return 1; +} + +void Feb_Control_SetMasterVariable(int val) { Feb_control_master = val; } + +int Feb_Control_SetMaster(enum MASTERINDEX ind) { + uint32_t offset = DAQ_REG_HRDWRE; + unsigned int addr[2] = {Module_GetLeftAddress(&modules[1]), + Module_GetRightAddress(&modules[1])}; + char *master_names[] = {MASTER_NAMES}; + for (int i = 0; i < 2; ++i) { + uint32_t value = 0; + if (!Feb_Interface_ReadRegister(addr[i], offset, &value)) { + LOG(logERROR, ("Could not read %s Feb reg to set Master flag\n", + (i == 0 ? "left" : "right"))); + return 0; + } + switch (ind) { + case MASTER_HARDWARE: + value &= ~DAQ_REG_HRDWRE_OW_MASTER_MSK; + break; + case OW_MASTER: + value |= DAQ_REG_HRDWRE_OW_MASTER_MSK; + value |= DAQ_REG_HRDWRE_MASTER_MSK; + break; + case OW_SLAVE: + value |= DAQ_REG_HRDWRE_OW_MASTER_MSK; + value &= ~DAQ_REG_HRDWRE_MASTER_MSK; + break; + default: + LOG(logERROR, ("Unknown master index in Feb: %d\n", ind)); + return 0; + } + + if (!Feb_Interface_WriteRegister(addr[i], offset, value, 0, 0)) { + LOG(logERROR, ("Could not set Master flag to %s in %s Feb\n", + master_names[ind], (i == 0 ? "left" : "right"))); + return 0; + } + } + LOG(logINFOBLUE, ("%s Master flag to %s Feb\n", + (ind == MASTER_HARDWARE ? "Resetting" : "Overwriting"), + master_names[ind])); + return 1; +} + +int Feb_Control_SetQuad(int val) { + LOG(logINFO, ("Setting Quad to %d in Feb\n", val)); + // only setting on the right feb if quad + return Feb_Control_SetTop(val == 0 ? TOP_HARDWARE : OW_TOP, 0, 1); +} + +int Feb_Control_SetReadNLines(int value) { + LOG(logINFO, ("Setting Read N Lines to %d\n", value)); + if (!Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), + DAQ_REG_PARTIAL_READOUT, value, 0, 0)) { + LOG(logERROR, ("Could not write %d to read n lines reg\n", value)); + return 0; + } + return 1; +} + +int Feb_Control_GetReadNLines() { + uint32_t regVal = 0; + if (!Feb_Interface_ReadRegister(Feb_Control_AddressToAll(), + DAQ_REG_PARTIAL_READOUT, ®Val)) { + LOG(logERROR, ("Could not read back read n lines reg\n")); + return -1; + } + LOG(logDEBUG1, ("Retval read n lines: %d\n", regVal)); + return regVal; +} + +int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { + uint32_t actualOffset = offset; + char side[2][10] = {"right", "left"}; + unsigned int addr[2] = {Module_GetRightAddress(&modules[1]), + Module_GetLeftAddress(&modules[1])}; + + int run[2] = {0, 0}; + // both registers + if (offset < 0x100) { + run[0] = 1; + run[1] = 1; + } + // right registers only + else if (offset >= 0x200) { + run[0] = 1; + actualOffset = offset - 0x200; + } + // left registers only + else { + run[1] = 1; + actualOffset = offset - 0x100; + } + + for (int iloop = 0; iloop < 2; ++iloop) { + if (run[iloop]) { + LOG(logINFO, + ("Writing 0x%x to %s 0x%x\n", data, side[iloop], actualOffset)); + if (!Feb_Interface_WriteRegister(addr[iloop], actualOffset, data, 0, + 0)) { + LOG(logERROR, ("Could not write 0x%x to %s addr 0x%x\n", data, + side[iloop], actualOffset)); + return 0; + } + } + } + + return 1; +} + +int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval) { + uint32_t actualOffset = offset; + char side[2][10] = {"right", "left"}; + unsigned int addr[2] = {Module_GetRightAddress(&modules[1]), + Module_GetLeftAddress(&modules[1])}; + uint32_t value[2] = {0, 0}; + int run[2] = {0, 0}; + // both registers + if (offset < 0x100) { + run[0] = 1; + run[1] = 1; + } + // right registers only + else if (offset >= 0x200) { + run[0] = 1; + actualOffset = offset - 0x200; + } + // left registers only + else { + run[1] = 1; + actualOffset = offset - 0x100; + } + + for (int iloop = 0; iloop < 2; ++iloop) { + if (run[iloop]) { + if (!Feb_Interface_ReadRegister(addr[iloop], actualOffset, + &value[iloop])) { + LOG(logERROR, ("Could not read from %s addr 0x%x\n", + side[iloop], actualOffset)); + return 0; + } + LOG(logINFO, ("Read 0x%x from %s 0x%x\n", value[iloop], side[iloop], + actualOffset)); + *retval = value[iloop]; + // if not the other (left, not right OR right, not left), return the + // value + if (!run[iloop ? 0 : 1]) { + return 1; + } + } + } + // Inconsistent values + if (value[0] != value[1]) { + LOG(logERROR, + ("Inconsistent values read from left 0x%x and right 0x%x\n", + value[0], value[1])); + return 0; + } + return 1; +} + +// pulsing int Feb_Control_Pulse_Pixel(int npulses, int x, int y) { // this function is not designed for speed - int pulse_multiple = 0; // has to be 0 or 1 if (x < 0) { @@ -1792,7 +1724,6 @@ int Feb_Control_Pulse_Pixel(int npulses, int x, int y) { Feb_Control_SendTokenIn(); Feb_Control_ClockRowClock(nrowclocks); Feb_Control_PulsePixelNMove(npulses, 0, 0); - return 1; } @@ -1811,11 +1742,9 @@ int Feb_Control_PulsePixelNMove(int npulses, int inc_x_pos, int inc_y_pos) { return 0; } } - return 1; } -/**new*/ int Feb_Control_Shift32InSerialIn(unsigned int value_to_shift_in) { if (Feb_Control_activated) { if (!Feb_Control_SetCommandRegister(DAQ_SERIALIN_SHIFT_IN_32) || @@ -1846,7 +1775,6 @@ int Feb_Control_ClockRowClock(unsigned int ntimes) { ntimes)); ntimes = 1023; } - if (Feb_Control_activated) { if (!Feb_Control_SetCommandRegister(DAQ_CLK_ROW_CLK_NTIMES) || !Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), @@ -1857,13 +1785,11 @@ int Feb_Control_ClockRowClock(unsigned int ntimes) { return 0; } } - return 1; } int Feb_Control_PulseChip(int npulses) { int on = 1; - if (npulses == -1) { on = 0; LOG(logINFO, ("\nResetting to normal mode\n")); @@ -1889,7 +1815,6 @@ int Feb_Control_PulseChip(int npulses) { Feb_Control_SetExternalEnableMode(on, 1); Feb_Control_counter_bit = (on ? 0 : 1); LOG(logINFO, ("Feb_Control_counter_bit:%d\n", Feb_Control_counter_bit)); - if (on) { LOG(logINFO, ("Pulse chip success\n\n")); } else { @@ -1898,15 +1823,16 @@ int Feb_Control_PulseChip(int npulses) { return 1; } +// rate correction int64_t Feb_Control_Get_RateTable_Tau_in_nsec() { return Feb_Control_RateTable_Tau_in_nsec; } + int64_t Feb_Control_Get_RateTable_Period_in_nsec() { return Feb_Control_RateTable_Period_in_nsec; } int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec) { - // period = exptime if 16bit, period = subexptime if 32 bit int dr = Feb_Control_GetDynamicRange(); double period_in_sec = @@ -1936,7 +1862,6 @@ int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec) { LOG(logINFO, ("Changing Rate Correction Table tau:%0.8f sec, period:%f sec", tau_in_sec, period_in_sec)); - LOG(logINFO, ("\tCalculating table for tau of %lld ns.\n", tau_in_Nsec)); for (int i = 0; i < np; i++) { Feb_Control_rate_meas[i] = i * exp(-i / period_in_sec * tau_in_sec); @@ -2070,37 +1995,17 @@ int Feb_Control_SetRateCorrectionTable(unsigned int *table) { } LOG(logINFO, ("daq reset completely\n")); - if (Module_TopAddressIsValid(&modules[1])) { - if (Feb_Control_activated) { - if (!Feb_Interface_WriteMemoryInLoops( - Module_GetTopLeftAddress( - &modules[Feb_Control_current_index]), - 1, 0, 1024, Feb_Control_rate_correction_table) || - !Feb_Interface_WriteMemoryInLoops( - Module_GetTopRightAddress( - &modules[Feb_Control_current_index]), - 1, 0, 1024, Feb_Control_rate_correction_table) || - (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { - LOG(logERROR, ("could not write to memory (top) " - "::Feb_Control_SetRateCorrectionTable\n")); - return 0; - } - } - } else { - if (Feb_Control_activated) { - if (!Feb_Interface_WriteMemoryInLoops( - Module_GetBottomLeftAddress( - &modules[Feb_Control_current_index]), - 1, 0, 1024, Feb_Control_rate_correction_table) || - !Feb_Interface_WriteMemoryInLoops( - Module_GetBottomRightAddress( - &modules[Feb_Control_current_index]), - 1, 0, 1024, Feb_Control_rate_correction_table) || - (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { - LOG(logERROR, ("could not write to memory (bottom) " - "::Feb_Control_SetRateCorrectionTable\n")); - return 0; - } + if (Feb_Control_activated) { + if (!Feb_Interface_WriteMemoryInLoops( + Module_GetLeftAddress(&modules[1]), 1, 0, 1024, + Feb_Control_rate_correction_table) || + !Feb_Interface_WriteMemoryInLoops( + Module_GetRightAddress(&modules[1]), 1, 0, 1024, + Feb_Control_rate_correction_table) || + (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { + LOG(logERROR, ("could not write to memory (top) " + "::Feb_Control_SetRateCorrectionTable\n")); + return 0; } } return 1; @@ -2142,17 +2047,14 @@ int Feb_Control_PrintCorrectedValues() { return 1; } +// adcs // So if software says now 40.00 you neeed to convert to mdegrees 40000(call it // A1) and then A1/65536/0.00198421639-273.15 - int Feb_Control_GetLeftFPGATemp() { unsigned int temperature = 0; - if (Module_TopAddressIsValid(&modules[1])) - Feb_Interface_ReadRegister(Module_GetTopLeftAddress(&modules[1]), - FEB_REG_STATUS, &temperature); - else - Feb_Interface_ReadRegister(Module_GetBottomLeftAddress(&modules[1]), - FEB_REG_STATUS, &temperature); + Feb_Interface_ReadRegister(Module_GetLeftAddress(&modules[1]), + FEB_REG_STATUS, &temperature); + temperature = temperature >> 16; temperature = ((((float)(temperature) / 65536.0f) / 0.00198421639f) - 273.15f) * @@ -2163,12 +2065,8 @@ int Feb_Control_GetLeftFPGATemp() { int Feb_Control_GetRightFPGATemp() { unsigned int temperature = 0; - if (Module_TopAddressIsValid(&modules[1])) - Feb_Interface_ReadRegister(Module_GetTopRightAddress(&modules[1]), - FEB_REG_STATUS, &temperature); - else - Feb_Interface_ReadRegister(Module_GetBottomRightAddress(&modules[1]), - FEB_REG_STATUS, &temperature); + Feb_Interface_ReadRegister(Module_GetRightAddress(&modules[1]), + FEB_REG_STATUS, &temperature); temperature = temperature >> 16; temperature = ((((float)(temperature) / 65536.0f) / 0.00198421639f) - 273.15f) * @@ -2178,357 +2076,15 @@ int Feb_Control_GetRightFPGATemp() { } int64_t Feb_Control_GetMeasuredPeriod() { - unsigned int sub_num = (Module_TopAddressIsValid(&modules[1])) - ? Module_GetTopLeftAddress(&modules[1]) - : Module_GetBottomLeftAddress(&modules[1]); - unsigned int value = 0; - Feb_Interface_ReadRegister(sub_num, MEAS_PERIOD_REG, &value); + Feb_Interface_ReadRegister(Module_GetLeftAddress(&modules[1]), + MEAS_PERIOD_REG, &value); return (int64_t)value * 10; } int64_t Feb_Control_GetSubMeasuredPeriod() { - unsigned int sub_num = (Module_TopAddressIsValid(&modules[1])) - ? Module_GetTopLeftAddress(&modules[1]) - : Module_GetBottomLeftAddress(&modules[1]); - unsigned int value = 0; - Feb_Interface_ReadRegister(sub_num, MEAS_SUBPERIOD_REG, &value); + Feb_Interface_ReadRegister(Module_GetLeftAddress(&modules[1]), + MEAS_SUBPERIOD_REG, &value); return (int64_t)value * 10; } - -int Feb_Control_SoftwareTrigger() { - unsigned int orig_value = 0; - Feb_Interface_ReadRegister(Feb_Control_AddressToAll(), DAQ_REG_CHIP_CMDS, - &orig_value); - - unsigned int cmd = orig_value | DAQ_REG_CHIP_CMDS_INT_TRIGGER; - - if (Feb_Control_activated) { - // set trigger bit - LOG(logDEBUG1, ("Setting Trigger, Register:0x%x\n", cmd)); - if (!Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), - DAQ_REG_CHIP_CMDS, cmd, 0, 0)) { - LOG(logERROR, ("Could not give software trigger\n")); - return 0; - } - // unset trigger bit - LOG(logDEBUG1, ("Unsetting Trigger, Register:0x%x\n", orig_value)); - if (!Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), - DAQ_REG_CHIP_CMDS, orig_value, 0, 0)) { - LOG(logERROR, ("Could not give software trigger\n")); - return 0; - } - LOG(logINFO, ("Software Internal Trigger Sent!\n")); - } - - return 1; -} - -int Feb_Control_SetInterruptSubframe(int val) { - LOG(logINFO, ("Setting Interrupt Subframe to %d\n", val)); - - // they need to be written separately because the left and right registers - // have different values for this particular register - uint32_t offset = DAQ_REG_HRDWRE; - uint32_t regVal = 0; - char side[2][10] = {"right", "left"}; - char isTop[10]; - strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom"); - unsigned int addr[2]; - addr[0] = Module_TopAddressIsValid(&modules[1]) - ? Module_GetTopRightAddress(&modules[1]) - : Module_GetBottomRightAddress(&modules[1]); - addr[1] = Module_TopAddressIsValid(&modules[1]) - ? Module_GetTopLeftAddress(&modules[1]) - : Module_GetBottomLeftAddress(&modules[1]); - - for (int iloop = 0; iloop < 2; ++iloop) { - // get previous value to keep it - if (!Feb_Interface_ReadRegister(addr[iloop], offset, ®Val)) { - LOG(logERROR, ("Could not read %s %s interrupt subframe\n", isTop, - side[iloop])); - return 0; - } - uint32_t data = ((val == 0) ? (regVal & ~DAQ_REG_HRDWRE_INTRRPT_SF_MSK) - : (regVal | DAQ_REG_HRDWRE_INTRRPT_SF_MSK)); - if (!Feb_Interface_WriteRegister(addr[iloop], offset, data, 0, 0)) { - LOG(logERROR, - ("Could not write 0x%x to %s %s interrupt subframe addr 0x%x\n", - data, isTop, side[iloop], offset)); - return 0; - } - } - return 1; -} - -int Feb_Control_GetInterruptSubframe() { - // they need to be written separately because the left and right registers - // have different values for this particular register - uint32_t offset = DAQ_REG_HRDWRE; - uint32_t regVal = 0; - - char side[2][10] = {"right", "left"}; - char isTop[10]; - strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom"); - unsigned int addr[2]; - addr[0] = Module_TopAddressIsValid(&modules[1]) - ? Module_GetTopRightAddress(&modules[1]) - : Module_GetBottomRightAddress(&modules[1]); - addr[1] = Module_TopAddressIsValid(&modules[1]) - ? Module_GetTopLeftAddress(&modules[1]) - : Module_GetBottomLeftAddress(&modules[1]); - uint32_t value[2] = {0, 0}; - - for (int iloop = 0; iloop < 2; ++iloop) { - if (!Feb_Interface_ReadRegister(addr[iloop], offset, ®Val)) { - LOG(logERROR, ("Could not read back %s %s interrupt subframe\n", - isTop, side[iloop])); - return -1; - } - value[iloop] = (regVal & DAQ_REG_HRDWRE_INTRRPT_SF_MSK) >> - DAQ_REG_HRDWRE_INTRRPT_SF_OFST; - } - - // inconsistent - if (value[0] != value[1]) { - LOG(logERROR, ("Inconsistent values of interrupt subframe betweeen " - "left %d and right %d\n", - value[0], value[1])); - return -1; - } - return value[0]; -} - -int Feb_Control_SetTop(enum TOPINDEX ind, int left, int right) { - uint32_t offset = DAQ_REG_HRDWRE; - unsigned int addr[2] = {0, 0}; - if (left) { - addr[0] = Module_GetTopLeftAddress(&modules[1]); - } - if (right) { - addr[1] = Module_GetTopRightAddress(&modules[1]); - } - char *top_names[] = {TOP_NAMES}; - for (int i = 0; i < 2; ++i) { - if (addr[i] == 0) { - continue; - } - uint32_t value = 0; - if (!Feb_Interface_ReadRegister(addr[i], offset, &value)) { - LOG(logERROR, ("Could not read %s Feb reg to set Top flag\n", - (i == 0 ? "left" : "right"))); - return 0; - } - switch (ind) { - case TOP_HARDWARE: - value &= ~DAQ_REG_HRDWRE_OW_TOP_MSK; - break; - case OW_TOP: - value |= DAQ_REG_HRDWRE_OW_TOP_MSK; - value |= DAQ_REG_HRDWRE_TOP_MSK; - break; - case OW_BOTTOM: - value |= DAQ_REG_HRDWRE_OW_TOP_MSK; - value &= ~DAQ_REG_HRDWRE_TOP_MSK; - break; - default: - LOG(logERROR, ("Unknown top index in Feb: %d\n", ind)); - return 0; - } - if (!Feb_Interface_WriteRegister(addr[i], offset, value, 0, 0)) { - LOG(logERROR, ("Could not set Top flag to %s in %s Feb\n", - top_names[ind], (i == 0 ? "left" : "right"))); - return 0; - } - } - if (left && right) { - LOG(logINFOBLUE, ("%s Top flag to %s Feb\n", - (ind == TOP_HARDWARE ? "Resetting" : "Overwriting"), - top_names[ind])); - } - return 1; -} - -void Feb_Control_SetMasterVariable(int val) { Feb_control_master = val; } - -int Feb_Control_SetMaster(enum MASTERINDEX ind) { - uint32_t offset = DAQ_REG_HRDWRE; - unsigned int addr[2] = {0, 0}; - addr[0] = Module_GetTopLeftAddress(&modules[1]); - addr[1] = Module_GetTopRightAddress(&modules[1]); - char *master_names[] = {MASTER_NAMES}; - for (int i = 0; i < 2; ++i) { - uint32_t value = 0; - if (!Feb_Interface_ReadRegister(addr[i], offset, &value)) { - LOG(logERROR, ("Could not read %s Feb reg to set Master flag\n", - (i == 0 ? "left" : "right"))); - return 0; - } - switch (ind) { - case MASTER_HARDWARE: - value &= ~DAQ_REG_HRDWRE_OW_MASTER_MSK; - break; - case OW_MASTER: - value |= DAQ_REG_HRDWRE_OW_MASTER_MSK; - value |= DAQ_REG_HRDWRE_MASTER_MSK; - break; - case OW_SLAVE: - value |= DAQ_REG_HRDWRE_OW_MASTER_MSK; - value &= ~DAQ_REG_HRDWRE_MASTER_MSK; - break; - default: - LOG(logERROR, ("Unknown master index in Feb: %d\n", ind)); - return 0; - } - - if (!Feb_Interface_WriteRegister(addr[i], offset, value, 0, 0)) { - LOG(logERROR, ("Could not set Master flag to %s in %s Feb\n", - master_names[ind], (i == 0 ? "left" : "right"))); - return 0; - } - } - LOG(logINFOBLUE, ("%s Master flag to %s Feb\n", - (ind == MASTER_HARDWARE ? "Resetting" : "Overwriting"), - master_names[ind])); - return 1; -} - -int Feb_Control_SetQuad(int val) { - // no bottom for quad - if (!Module_TopAddressIsValid(&modules[1])) { - return 1; - } - LOG(logINFO, ("Setting Quad to %d in Feb\n", val)); - // only setting on the right feb if quad - return Feb_Control_SetTop(val == 0 ? TOP_HARDWARE : OW_TOP, 0, 1); -} - -int Feb_Control_SetReadNLines(int value) { - LOG(logINFO, ("Setting Read N Lines to %d\n", value)); - if (!Feb_Interface_WriteRegister(Feb_Control_AddressToAll(), - DAQ_REG_PARTIAL_READOUT, value, 0, 0)) { - LOG(logERROR, ("Could not write %d to read n lines reg\n", value)); - return 0; - } - - return 1; -} - -int Feb_Control_GetReadNLines() { - uint32_t regVal = 0; - if (!Feb_Interface_ReadRegister(Feb_Control_AddressToAll(), - DAQ_REG_PARTIAL_READOUT, ®Val)) { - LOG(logERROR, ("Could not read back read n lines reg\n")); - return -1; - } - LOG(logDEBUG1, ("Retval read n lines: %d\n", regVal)); - return regVal; -} - -int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { - uint32_t actualOffset = offset; - char side[2][10] = {"right", "left"}; - char isTop[10]; - strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom"); - unsigned int addr[2]; - addr[0] = Module_TopAddressIsValid(&modules[1]) - ? Module_GetTopRightAddress(&modules[1]) - : Module_GetBottomRightAddress(&modules[1]); - addr[1] = Module_TopAddressIsValid(&modules[1]) - ? Module_GetTopLeftAddress(&modules[1]) - : Module_GetBottomLeftAddress(&modules[1]); - - int run[2] = {0, 0}; - // both registers - if (offset < 0x100) { - run[0] = 1; - run[1] = 1; - } - // right registers only - else if (offset >= 0x200) { - run[0] = 1; - actualOffset = offset - 0x200; - } - // left registers only - else { - run[1] = 1; - actualOffset = offset - 0x100; - } - - for (int iloop = 0; iloop < 2; ++iloop) { - if (run[iloop]) { - LOG(logINFO, ("Writing 0x%x to %s %s 0x%x\n", data, isTop, - side[iloop], actualOffset)); - if (!Feb_Interface_WriteRegister(addr[iloop], actualOffset, data, 0, - 0)) { - LOG(logERROR, ("Could not write 0x%x to %s %s addr 0x%x\n", - data, isTop, side[iloop], actualOffset)); - return 0; - } - } - } - - return 1; -} - -int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval) { - uint32_t actualOffset = offset; - char side[2][10] = {"right", "left"}; - char isTop[10]; - strcpy(isTop, Module_TopAddressIsValid(&modules[1]) ? "top" : "bottom"); - unsigned int addr[2]; - addr[0] = Module_TopAddressIsValid(&modules[1]) - ? Module_GetTopRightAddress(&modules[1]) - : Module_GetBottomRightAddress(&modules[1]); - addr[1] = Module_TopAddressIsValid(&modules[1]) - ? Module_GetTopLeftAddress(&modules[1]) - : Module_GetBottomLeftAddress(&modules[1]); - - uint32_t value[2] = {0, 0}; - - int run[2] = {0, 0}; - // both registers - if (offset < 0x100) { - run[0] = 1; - run[1] = 1; - } - // right registers only - else if (offset >= 0x200) { - run[0] = 1; - actualOffset = offset - 0x200; - } - // left registers only - else { - run[1] = 1; - actualOffset = offset - 0x100; - } - - for (int iloop = 0; iloop < 2; ++iloop) { - if (run[iloop]) { - if (!Feb_Interface_ReadRegister(addr[iloop], actualOffset, - &value[iloop])) { - LOG(logERROR, ("Could not read from %s %s addr 0x%x\n", isTop, - side[iloop], actualOffset)); - return 0; - } - LOG(logINFO, ("Read 0x%x from %s %s 0x%x\n", value[iloop], isTop, - side[iloop], actualOffset)); - *retval = value[iloop]; - // if not the other (left, not right OR right, not left), return the - // value - if (!run[iloop ? 0 : 1]) { - return 1; - } - } - } - - // Inconsistent values - if (value[0] != value[1]) { - LOG(logERROR, - ("Inconsistent values read from left 0x%x and right 0x%x\n", - value[0], value[1])); - return 0; - } - return 1; -} diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index bd38c4476..dbd946fd2 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -11,10 +11,8 @@ struct Module { float high_voltage; int *dac; }; - -void Module_Module(struct Module *mod, unsigned int number, - unsigned int address_top); -unsigned int Module_GetModuleNumber(struct Module *mod); +// module struct +void Module_Module(struct Module *mod, unsigned int number); unsigned int Module_GetBaseAddress(struct Module *mod); unsigned int Module_GetLeftAddress(struct Module *mod); unsigned int Module_GetRightAddress(struct Module *mod); @@ -25,72 +23,76 @@ float Module_SetHighVoltage(struct Module *mod, float value); float Module_GetHighVoltage(struct Module *mod); int Module_SetDACValue(struct Module *mod, unsigned int i, int value); int Module_GetDACValue(struct Module *mod, unsigned int i); - +// setup void Feb_Control_activate(int activate); int Feb_Control_GetModuleNumber(); -void Feb_Control_PrintModuleList(); -int Feb_Control_GetModuleIndex(unsigned int module_number, - unsigned int *module_index); -int Feb_Control_CheckModuleAddresses(struct Module *m); -int Feb_Control_AddModule(unsigned int module_number, unsigned int top_address); -int Feb_Control_GetDACNumber(char *s, unsigned int *n); -int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, - unsigned int *value); -int Feb_Control_VoltageToDAC(float value, unsigned int *digital, - unsigned int nsteps, float vmin, float vmax); -float Feb_Control_DACToVoltage(unsigned int digital, unsigned int nsteps, - float vmin, float vmax); -int Feb_Control_SendIDelays(unsigned int dst_num, int chip_lr, - unsigned int channels, unsigned int ndelay_units); -int Feb_Control_SetStaticBits(); -int Feb_Control_SetStaticBits1(unsigned int the_static_bits); -int Feb_Control_SendBitModeToBebServer(); -unsigned int Feb_Control_ConvertTimeToRegister(float time_in_sec); -unsigned int Feb_Control_AddressToAll(); -int Feb_Control_SetCommandRegister(unsigned int cmd); -int Feb_Control_GetDAQStatusRegister(unsigned int dst_address, - unsigned int *ret_status); -int Feb_Control_StartDAQOnlyNWaitForFinish(int sleep_time_us); -int Feb_Control_ResetChipCompletely(); -int Feb_Control_ResetChipPartially(); void Feb_Control_FebControl(); int Feb_Control_Init(int master, int normal, int module_num); int Feb_Control_OpenSerialCommunication(); void Feb_Control_CloseSerialCommunication(); +void Feb_Control_PrintModuleList(); +void Feb_Control_AddModule(unsigned int module_number); int Feb_Control_CheckSetup(); -unsigned int Feb_Control_GetNModules(); -unsigned int Feb_Control_GetNHalfModules(); - +unsigned int Feb_Control_AddressToAll(); +int Feb_Control_SetCommandRegister(unsigned int cmd); +int Feb_Control_SetStaticBits(); +int Feb_Control_SetStaticBits1(unsigned int the_static_bits); +int Feb_Control_SetInTestModeVariable(int on); +int Feb_Control_GetTestModeVariable(); +// idelays +int Feb_Control_SetIDelays(unsigned int ndelay_units); +int Feb_Control_SetIDelays1(unsigned int chip_pos, unsigned int ndelay_units); +int Feb_Control_SendIDelays(unsigned int dst_num, int chip_lr, + unsigned int channels, unsigned int ndelay_units); +// high voltage int Feb_Control_SetHighVoltage(int value); int Feb_Control_GetHighVoltage(int *value); - int Feb_Control_SendHighVoltage(int dacvalue); int Feb_Control_ReceiveHighVoltage(unsigned int *value); - -int Feb_Control_SetIDelays(unsigned int module_num, unsigned int ndelay_units); -int Feb_Control_SetIDelays1(unsigned int module_num, unsigned int chip_pos, - unsigned int ndelay_units); - -int Feb_Control_DecodeDACString(char *dac_str, unsigned int *module_index, - int *top, int *bottom, unsigned int *dac_ch); +// dacs +int Feb_Control_VoltageToDAC(float value, unsigned int *digital, + unsigned int nsteps, float vmin, float vmax); +float Feb_Control_DACToVoltage(unsigned int digital, unsigned int nsteps, + float vmin, float vmax); +int Feb_Control_DecodeDACString(char *dac_str, unsigned int *dac_ch); int Feb_Control_SetDAC(char *s, int value, int is_a_voltage_mv); int Feb_Control_GetDAC(char *s, int *ret_value, int voltage_mv); int Feb_Control_GetDACName(unsigned int dac_num, char *s); +int Feb_Control_GetDACNumber(char *s, unsigned int *n); +int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, + unsigned int *value); -int Feb_Control_SetTrimbits(unsigned int module_num, unsigned int *trimbits, - int top); -unsigned int *Feb_Control_GetTrimbits(); +// trimbits +int Feb_Control_SetTrimbits(unsigned int *trimbits, int top); int Feb_Control_SaveAllTrimbitsTo(int value, int top); -int Feb_Control_Reset(); -int Feb_Control_PrepareForAcquisition(); +unsigned int *Feb_Control_GetTrimbits(); -int Feb_Control_StartAcquisition(); -int Feb_Control_StopAcquisition(); +// acquisition int Feb_Control_AcquisitionInProgress(); int Feb_Control_AcquisitionStartedBit(); -int Feb_Control_WaitForFinishedFlag(int sleep_time_us); int Feb_Control_WaitForStartedFlag(int sleep_time_us, int prev_flag); +int Feb_Control_WaitForFinishedFlag(int sleep_time_us); +int Feb_Control_GetDAQStatusRegister(unsigned int dst_address, + unsigned int *ret_status); +int Feb_Control_StartDAQOnlyNWaitForFinish(int sleep_time_us); +int Feb_Control_Reset(); +int Feb_Control_ResetChipCompletely(); +int Feb_Control_ResetChipPartially(); +int Feb_Control_SendBitModeToBebServer(); +unsigned int Feb_Control_ConvertTimeToRegister(float time_in_sec); +int Feb_Control_PrepareForAcquisition(); void Feb_Control_PrintAcquisitionSetup(); +int Feb_Control_StartAcquisition(); +int Feb_Control_StopAcquisition(); +int Feb_Control_SoftwareTrigger(); + +// parameters +int Feb_Control_SetDynamicRange(unsigned int four_eight_sixteen_or_thirtytwo); +unsigned int Feb_Control_GetDynamicRange(); +int Feb_Control_SetReadoutSpeed(unsigned int readout_speed); +int Feb_Control_SetReadoutMode(unsigned int readout_mode); +int Feb_Control_SetTriggerMode(unsigned int trigger_mode); +int Feb_Control_SetExternalEnableMode(int use_external_enable, int polarity); int Feb_Control_SetNExposures(unsigned int n_images); unsigned int Feb_Control_GetNExposures(); int Feb_Control_SetExposureTime(double the_exposure_time_in_sec); @@ -103,25 +105,20 @@ int Feb_Control_SetSubFramePeriod(int64_t the_subframe_period_in_10nsec); int64_t Feb_Control_GetSubFramePeriod(); int Feb_Control_SetExposurePeriod(double the_exposure_period_in_sec); double Feb_Control_GetExposurePeriod(); -int Feb_Control_SetDynamicRange(unsigned int four_eight_sixteen_or_thirtytwo); -unsigned int Feb_Control_GetDynamicRange(); -int Feb_Control_SetReadoutSpeed( - unsigned int readout_speed); // 0 was default, 0->full,1->half,2->quarter or - // 3->super_slow -int Feb_Control_SetReadoutMode( - unsigned int readout_mode); /// 0 was - /// default,0->parallel,1->non-parallel,2-> - /// safe_mode -int Feb_Control_SetTriggerMode(unsigned int trigger_mode, - int polarity); // 0 and 1 was default, -int Feb_Control_SetExternalEnableMode(int use_external_enable, - int polarity); // 0 and 1 was default, - -int Feb_Control_SetInTestModeVariable(int on); -int Feb_Control_GetTestModeVariable(); - void Feb_Control_Set_Counter_Bit(int value); int Feb_Control_Get_Counter_Bit(); +int Feb_Control_SetInterruptSubframe(int val); +int Feb_Control_GetInterruptSubframe(); +int Feb_Control_SetTop(enum TOPINDEX ind, int left, int right); +void Feb_Control_SetMasterVariable(int val); +int Feb_Control_SetMaster(enum MASTERINDEX ind); +int Feb_Control_SetQuad(int val); +int Feb_Control_SetReadNLines(int value); +int Feb_Control_GetReadNLines(); +int Feb_Control_WriteRegister(uint32_t offset, uint32_t data); +int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval); + +// pulsing int Feb_Control_Pulse_Pixel(int npulses, int x, int y); int Feb_Control_PulsePixelNMove(int npulses, int inc_x_pos, int inc_y_pos); int Feb_Control_Shift32InSerialIn(unsigned int value_to_shift_in); @@ -129,6 +126,7 @@ int Feb_Control_SendTokenIn(); int Feb_Control_ClockRowClock(unsigned int ntimes); int Feb_Control_PulseChip(int npulses); +// rate correction int64_t Feb_Control_Get_RateTable_Tau_in_nsec(); int64_t Feb_Control_Get_RateTable_Period_in_nsec(); int Feb_Control_SetRateCorrectionTau(int64_t tau_in_Nsec); @@ -137,22 +135,8 @@ int Feb_Control_GetRateCorrectionVariable(); void Feb_Control_SetRateCorrectionVariable(int activate_rate_correction); int Feb_Control_PrintCorrectedValues(); +// adcs int Feb_Control_GetLeftFPGATemp(); int Feb_Control_GetRightFPGATemp(); - int64_t Feb_Control_GetMeasuredPeriod(); int64_t Feb_Control_GetSubMeasuredPeriod(); - -int Feb_Control_SoftwareTrigger(); -int Feb_Control_SetInterruptSubframe(int val); -int Feb_Control_GetInterruptSubframe(); - -int Feb_Control_SetTop(enum TOPINDEX ind, int left, int right); -void Feb_Control_SetMasterVariable(int val); -int Feb_Control_SetMaster(enum MASTERINDEX ind); -int Feb_Control_SetQuad(int val); -int Feb_Control_SetReadNLines(int value); -int Feb_Control_GetReadNLines(); - -int Feb_Control_WriteRegister(uint32_t offset, uint32_t data); -int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval); diff --git a/slsDetectorServers/eigerDetectorServer/FebInterface.c b/slsDetectorServers/eigerDetectorServer/FebInterface.c index d39ff7c04..20f5cd4e1 100644 --- a/slsDetectorServers/eigerDetectorServer/FebInterface.c +++ b/slsDetectorServers/eigerDetectorServer/FebInterface.c @@ -41,13 +41,13 @@ void Feb_Interface_FebInterface() { ll, XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_RIGHT_BASEADDR); } -void Feb_Interface_SendCompleteList(unsigned int n, unsigned int *list) { +void Feb_Interface_SetAddress(unsigned int leftAddr, unsigned int rightAddr) { if (Feb_Interface_feb_numb) free(Feb_Interface_feb_numb); - Feb_Interface_nfebs = n; - Feb_Interface_feb_numb = malloc(n * sizeof(unsigned int)); - for (unsigned int i = 0; i < n; i++) - Feb_Interface_feb_numb[i] = list[i]; + Feb_Interface_nfebs = 2; + Feb_Interface_feb_numb = malloc(2 * sizeof(unsigned int)); + Feb_Interface_feb_numb[0] = leftAddr; + Feb_Interface_feb_numb[1] = rightAddr; } int Feb_Interface_WriteTo(unsigned int ch) { @@ -104,7 +104,9 @@ int Feb_Interface_SetByteOrder() { for (unsigned int i = 0; i < Feb_Interface_nfebs; i++) dst = (dst | Feb_Interface_feb_numb[i]); int passed = Feb_Interface_WriteTo(dst); - + if (!passed) { + LOG(logERROR, ("Could not set byte order in Feb Interface\n")); + } return passed; } diff --git a/slsDetectorServers/eigerDetectorServer/FebInterface.h b/slsDetectorServers/eigerDetectorServer/FebInterface.h index 64216023d..d80785695 100644 --- a/slsDetectorServers/eigerDetectorServer/FebInterface.h +++ b/slsDetectorServers/eigerDetectorServer/FebInterface.h @@ -3,7 +3,7 @@ int Feb_Interface_WriteTo(unsigned int ch); int Feb_Interface_ReadFrom(unsigned int ch, unsigned int ntrys); void Feb_Interface_FebInterface(); -void Feb_Interface_SendCompleteList(unsigned int n, unsigned int *list); +void Feb_Interface_SetAddress(unsigned int n, unsigned int *list); int Feb_Interface_SetByteOrder(); int Feb_Interface_ReadRegister(unsigned int sub_num, unsigned int reg_num, unsigned int *value_read); diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 5733743c0..37a8131d5 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -333,11 +333,24 @@ void initControlServer() { Feb_Interface_FebInterface(); Feb_Control_FebControl(); // same addresses for top and bottom - Feb_Control_Init(master, normal, getDetectorNumber()); + if (!Feb_Control_Init(master, normal, getDetectorNumber()) { + initError = FAIL; + sprintf(initErrorMessage, "Could not intitalize feb control\n"); + LOG(logERROR, (initErrorMessage)); + initCheckDone = 1; + return; + } // master of 9M, check high voltage serial communication to blackfin if (master && !normal) { - if (Feb_Control_OpenSerialCommunication()) - ; // Feb_Control_CloseSerialCommunication(); + if (!Feb_Control_OpenSerialCommunication()) { + initError = FAIL; + sprintf( + initErrorMessage, + "Could not intitalize feb control serial communication\n"); + LOG(logERROR, (initErrorMessage)); + initCheckDone = 1; + return; + } } LOG(logDEBUG1, ("Control server: FEB Initialization done\n")); Beb_SetTopVariable(top); @@ -695,7 +708,12 @@ void setupDetector() { #endif setHighVoltage(DEFAULT_HIGH_VOLTAGE); #ifndef VIRTUAL - Feb_Control_CheckSetup(); + if (!Feb_Control_CheckSetup()) { + initError = FAIL; + sprintf(initErrorMessage, "Could not pass feb control setup checks\n"); + LOG(logERROR, (initErrorMessage)); + return; + } #endif // force top or master if in config file if (readConfigFile() == FAIL) { @@ -1049,7 +1067,7 @@ int setModule(sls_detector_module myMod, char *mess) { } // set trimbits - if (!Feb_Control_SetTrimbits(Feb_Control_GetModuleNumber(), tt, top)) { + if (!Feb_Control_SetTrimbits(tt, top)) { sprintf(mess, "Could not set module. Could not set trimbits\n"); LOG(logERROR, (mess)); setSettings(UNDEFINED); @@ -1355,7 +1373,7 @@ void setTiming(enum timingMode arg) { } LOG(logDEBUG1, ("Setting Triggering Mode: %d\n", (int)ret)); #ifndef VIRTUAL - if (Feb_Control_SetTriggerMode(ret, 1)) + if (Feb_Control_SetTriggerMode(ret)) #endif eiger_triggermode = ret; } @@ -1476,6 +1494,11 @@ int setQuad(int value) { if (value < 0) { return OK; } + // only top can be set to quad + if (!top & value > 0) { + LOG(logERROR, ("Only a top can be set to quad\n")); + return FAIL; + } #ifndef VIRTUAL if (Beb_SetQuad(value) == FAIL) { return FAIL; @@ -1580,7 +1603,7 @@ int setIODelay(int val) { if (val != -1) { LOG(logDEBUG1, ("Setting IO Delay: %d\n", val)); #ifndef VIRTUAL - if (Feb_Control_SetIDelays(Feb_Control_GetModuleNumber(), val)) + if (Feb_Control_SetIDelays(val)) #endif eiger_iodelay = val; } @@ -1813,6 +1836,8 @@ int64_t getCurrentTau() { } void setExternalGating(int enable[]) { + // not configured from client + // default: disable gating with positive polarity if (enable[0] >= 0 && enable[1] >= 0) { #ifndef VIRTUAL Feb_Control_SetExternalEnableMode( From bcb5b8047b142d0fb93983f6b1ce0ee951681b67 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 16:41:40 +0200 Subject: [PATCH 07/28] WIP --- slsDetectorServers/eigerDetectorServer/FebControl.c | 12 +++++------- .../eigerDetectorServer/slsDetectorFunctionList.c | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 403e0355f..1b1c90912 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -20,7 +20,7 @@ char Module_dac_names[16][10] = {"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", "Vcmp_rr", "Vcp", "Vcn", "Vishaper"}; -struct Module modules[10]; +struct Module modules[2]; int moduleSize = 0; unsigned int @@ -833,13 +833,11 @@ int Feb_Control_SetTrimbits(unsigned int *trimbits, int top) { if (Feb_Control_activated) { if (!Feb_Interface_WriteMemoryInLoops( - Module_GetLeftAddress( - &modules[Feb_Control_current_index]), - 0, 0, 1024, trimbits_to_load_l) || + Module_GetLeftAddress(&modules[1]), 0, 0, 1024, + trimbits_to_load_l) || !Feb_Interface_WriteMemoryInLoops( - Module_GetRightAddress( - &modules[Feb_Control_current_index]), - 0, 0, 1024, trimbits_to_load_r) || + Module_GetRightAddress(&modules[1]), 0, 0, 1024, + trimbits_to_load_r) || (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { LOG(logERROR, (" some errror in setting trimbits!\n")); diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 37a8131d5..424362fef 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -1495,7 +1495,7 @@ int setQuad(int value) { return OK; } // only top can be set to quad - if (!top & value > 0) { + if (!top && value > 0) { LOG(logERROR, ("Only a top can be set to quad\n")); return FAIL; } From cc8549e6cbad2eef07e129f1927a2972090c6524 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 16:43:16 +0200 Subject: [PATCH 08/28] WIP --- .../eigerDetectorServer/slsDetectorFunctionList.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 424362fef..e33355c24 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -333,7 +333,7 @@ void initControlServer() { Feb_Interface_FebInterface(); Feb_Control_FebControl(); // same addresses for top and bottom - if (!Feb_Control_Init(master, normal, getDetectorNumber()) { + if (!Feb_Control_Init(master, normal, getDetectorNumber())) { initError = FAIL; sprintf(initErrorMessage, "Could not intitalize feb control\n"); LOG(logERROR, (initErrorMessage)); From 569d0464e75eafc1a5f352127dc79ba5c7196891 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 16:44:18 +0200 Subject: [PATCH 09/28] WIP --- slsDetectorServers/eigerDetectorServer/FebInterface.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebInterface.h b/slsDetectorServers/eigerDetectorServer/FebInterface.h index d80785695..e89ff498d 100644 --- a/slsDetectorServers/eigerDetectorServer/FebInterface.h +++ b/slsDetectorServers/eigerDetectorServer/FebInterface.h @@ -3,7 +3,7 @@ int Feb_Interface_WriteTo(unsigned int ch); int Feb_Interface_ReadFrom(unsigned int ch, unsigned int ntrys); void Feb_Interface_FebInterface(); -void Feb_Interface_SetAddress(unsigned int n, unsigned int *list); +void Feb_Interface_SetAddress(unsigned int leftAddr, unsigned int rightAddr); int Feb_Interface_SetByteOrder(); int Feb_Interface_ReadRegister(unsigned int sub_num, unsigned int reg_num, unsigned int *value_read); From 0375e80b42065f737156204f0703d97e971ddb0d Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 16:51:59 +0200 Subject: [PATCH 10/28] WIP --- slsDetectorServers/eigerDetectorServer/FebControl.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 1b1c90912..140fef5cf 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -64,7 +64,7 @@ int Feb_Control_hv_fd = -1; void Module_Module(struct Module *mod, unsigned int number) { mod->module_number = number; mod->left_address = 0x100; - mod->right_address = (0x200; + mod->right_address = 0x200; if (number == 0u) { mod->left_address |= 0xff; mod->right_address |= 0xff; @@ -212,7 +212,7 @@ void Feb_Control_PrintModuleList() { for (unsigned int i = 0; i < moduleSize; i++) { LOG(logDEBUG1, ("\t%d) %s\t: [Module Number:%d, Base Address: 0x%x]\n", i, - ((i == 0) ? "Global" : "Half Module"), modules[i]->module_number, + ((i == 0) ? "Global" : "Half Module"), modules[i].module_number, Module_GetBaseAddress(&modules[i]))); } } @@ -858,7 +858,7 @@ int Feb_Control_SaveAllTrimbitsTo(int value, int top) { unsigned int chanregs[Feb_Control_trimbit_size]; for (int i = 0; i < Feb_Control_trimbit_size; i++) chanregs[i] = value; - return Feb_Control_SetTrimbits(0, chanregs, top); + return Feb_Control_SetTrimbits(chanregs, top); } unsigned int *Feb_Control_GetTrimbits() { From 5412569e775ad356801eeba9fff63a432545742b Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 17:10:38 +0200 Subject: [PATCH 11/28] WIP --- .../eigerDetectorServer/FebControl.c | 122 +++++++----------- .../eigerDetectorServer/FebControl.h | 7 +- 2 files changed, 46 insertions(+), 83 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 140fef5cf..59b4cd64d 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -20,8 +20,7 @@ char Module_dac_names[16][10] = {"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", "Vcmp_rr", "Vcp", "Vcn", "Vishaper"}; -struct Module modules[2]; -int moduleSize = 0; +struct Module module; unsigned int Feb_Control_staticBits; // program=1,m4=2,m8=4,test=8,rotest=16,cs_bar_left=32,cs_bar_right=64 @@ -47,8 +46,6 @@ int64_t Feb_Control_RateTable_Period_in_nsec = -1; unsigned int Feb_Control_trimbit_size; unsigned int *Feb_Control_last_downloaded_trimbits; -int Feb_Control_module_number; - int Feb_Control_counter_bit = 1; int Feb_control_master = 0; int Feb_control_normal = 0; @@ -62,13 +59,8 @@ int Feb_Control_hv_fd = -1; // module void Module_Module(struct Module *mod, unsigned int number) { - mod->module_number = number; mod->left_address = 0x100; mod->right_address = 0x200; - if (number == 0u) { - mod->left_address |= 0xff; - mod->right_address |= 0xff; - } mod->high_voltage = -1; mod->dac = malloc(Module_ndacs * sizeof(int)); for (unsigned int i = 0; i < Module_ndacs; i++) @@ -114,8 +106,6 @@ int Module_GetDACValue(struct Module *mod, unsigned int i) { // setup void Feb_Control_activate(int activate) { Feb_Control_activated = activate; } -int Feb_Control_GetModuleNumber() { return Feb_Control_module_number; } - void Feb_Control_FebControl() { Feb_Control_staticBits = Feb_Control_acquireNReadoutMode = Feb_Control_triggerMode = Feb_Control_externalEnableMode = @@ -123,25 +113,14 @@ void Feb_Control_FebControl() { Feb_Control_trimbit_size = 263680; Feb_Control_last_downloaded_trimbits = malloc(Feb_Control_trimbit_size * sizeof(int)); - moduleSize = 0; } int Feb_Control_Init(int master, int normal, int module_num) { Feb_control_master = master; Feb_control_normal = normal; - - // global send (module number 0) - Feb_Control_AddModule(0); - Feb_Control_PrintModuleList(); - - // Add the half module - Feb_Control_module_number = (module_num & 0xFF); - Feb_Control_AddModule(Feb_Control_module_number); - Feb_Control_PrintModuleList(); - - // interface setup - Feb_Interface_SetAddress(Module_GetRightAddress(&modules[1]), - Module_GetLeftAddress(&modules[1])); + Feb_Control_AddModule(); + Feb_Interface_SetAddress(Module_GetRightAddress(&module), + Module_GetLeftAddress(&module)); if (Feb_Control_activated) { return Feb_Interface_SetByteOrder(); } @@ -207,33 +186,22 @@ void Feb_Control_CloseSerialCommunication() { close(Feb_Control_hv_fd); } -void Feb_Control_PrintModuleList() { - LOG(logDEBUG1, ("Module list:\n")); - for (unsigned int i = 0; i < moduleSize; i++) { - LOG(logDEBUG1, - ("\t%d) %s\t: [Module Number:%d, Base Address: 0x%x]\n", i, - ((i == 0) ? "Global" : "Half Module"), modules[i].module_number, - Module_GetBaseAddress(&modules[i]))); - } -} - -void Feb_Control_AddModule(unsigned int module_number) { +void Feb_Control_AddModule() { struct Module mod, *m; m = &mod; - Module_Module(m, module_number); + Module_Module(m); LOG(logDEBUG1, ("\tAdding half module number %d with " "top base address: %d\n", m->module_number, Module_GetBaseAddress(m))); - modules[moduleSize] = mod; - moduleSize++; + module = mod; } int Feb_Control_CheckSetup(int master) { LOG(logDEBUG1, ("Checking Set up\n")); for (unsigned int j = 0; j < 4; j++) { - if (Module_GetIDelay(&modules[1], j) < 0) { + if (Module_GetIDelay(&module, j) < 0) { LOG(logERROR, ("idelay chip %d not set.\n", j)); return 0; } @@ -244,7 +212,7 @@ int Feb_Control_CheckSetup(int master) { return 0; } for (unsigned int j = 0; j < Module_ndacs; j++) { - if (Module_GetDACValue(&modules[1], j) < 0) { + if (Module_GetDACValue(&module, j) < 0) { LOG(logERROR, ("\"%s\" dac is not set.\n", Module_dac_names[j])); return 0; } @@ -254,8 +222,7 @@ int Feb_Control_CheckSetup(int master) { } unsigned int Feb_Control_AddressToAll() { - return Module_GetLeftAddress(&modules[1]) | - Module_GetRightAddress(&modules[1]); + return Module_GetLeftAddress(&module) | Module_GetRightAddress(&module); } int Feb_Control_SetCommandRegister(unsigned int cmd) { @@ -321,19 +288,19 @@ int Feb_Control_SetIDelays1( } if (chip_pos / 2 == 0) { // left fpga - if (Feb_Control_SendIDelays(Module_GetLeftAddress(&modules[1]), + if (Feb_Control_SendIDelays(Module_GetLeftAddress(&module), chip_pos % 2 == 0, 0xffffffff, ndelay_units)) { - Module_SetIDelay(&modules[1], chip_pos, ndelay_units); + Module_SetIDelay(&module, chip_pos, ndelay_units); } else { LOG(logERROR, ("could not set idelay (left).\n")); return 0; } } else { - if (Feb_Control_SendIDelays(Module_GetRightAddress(&modules[1]), + if (Feb_Control_SendIDelays(Module_GetRightAddress(&module), chip_pos % 2 == 0, 0xffffffff, ndelay_units)) { - Module_SetIDelay(&modules[1], chip_pos, ndelay_units); + Module_SetIDelay(&module, chip_pos, ndelay_units); } else { LOG(logERROR, ("could not set idelay (right).\n")); return 0; @@ -638,11 +605,10 @@ int Feb_Control_SetDAC(char *dac_str, int value, int is_a_voltage_mv) { LOG(logERROR, ("SetDac bad value, %d. The range is 0 to 4095.\n", v)); return 0; } - if (!Feb_Control_SendDACValue(Module_GetRightAddress(&modules[1]), dac_ch, - &v)) + if (!Feb_Control_SendDACValue(Module_GetRightAddress(&module), dac_ch, &v)) return 0; - Module_SetDACValue(&modules[1], dac_ch, v); + Module_SetDACValue(&module, dac_ch, v); return 1; } @@ -651,7 +617,7 @@ int Feb_Control_GetDAC(char *s, int *ret_value, int voltage_mv) { if (!Feb_Control_DecodeDACString(s, &dac_ch)) return 0; - *ret_value = Module_GetDACValue(&modules[1], dac_ch); + *ret_value = Module_GetDACValue(&module, dac_ch); if (voltage_mv) *ret_value = Feb_Control_DACToVoltage(*ret_value, 4096, 0, 2048); return 1; @@ -833,10 +799,10 @@ int Feb_Control_SetTrimbits(unsigned int *trimbits, int top) { if (Feb_Control_activated) { if (!Feb_Interface_WriteMemoryInLoops( - Module_GetLeftAddress(&modules[1]), 0, 0, 1024, + Module_GetLeftAddress(&module), 0, 0, 1024, trimbits_to_load_l) || !Feb_Interface_WriteMemoryInLoops( - Module_GetRightAddress(&modules[1]), 0, 0, 1024, + Module_GetRightAddress(&module), 0, 0, 1024, trimbits_to_load_r) || (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { @@ -871,13 +837,13 @@ int Feb_Control_AcquisitionInProgress() { if (!Feb_Control_activated) return STATUS_IDLE; - if (!(Feb_Control_GetDAQStatusRegister(Module_GetRightAddress(&modules[1]), + if (!(Feb_Control_GetDAQStatusRegister(Module_GetRightAddress(&module), &status_reg_r))) { LOG(logERROR, ("Error: Trouble reading Status register (right)" "address\n")); return STATUS_ERROR; } - if (!(Feb_Control_GetDAQStatusRegister(Module_GetLeftAddress(&modules[1]), + if (!(Feb_Control_GetDAQStatusRegister(Module_GetLeftAddress(&module), &status_reg_l))) { LOG(logERROR, ("Error: Trouble reading Status register (left)\n")); return STATUS_ERROR; @@ -896,12 +862,12 @@ int Feb_Control_AcquisitionStartedBit() { if (!Feb_Control_activated) return 1; - if (!(Feb_Control_GetDAQStatusRegister(Module_GetRightAddress(&modules[1]), + if (!(Feb_Control_GetDAQStatusRegister(Module_GetRightAddress(&module), &status_reg_r))) { LOG(logERROR, ("Error: Trouble reading Status register (right)\n")); return -1; } - if (!(Feb_Control_GetDAQStatusRegister(Module_GetLeftAddress(&modules[1]), + if (!(Feb_Control_GetDAQStatusRegister(Module_GetLeftAddress(&module), &status_reg_l))) { LOG(logERROR, ("Error: Trouble reading Status register (left)\n")); return -1; @@ -1416,8 +1382,8 @@ int Feb_Control_SetInterruptSubframe(int val) { uint32_t offset = DAQ_REG_HRDWRE; uint32_t regVal = 0; char side[2][10] = {"right", "left"}; - unsigned int addr[2] = {Module_GetRightAddress(&modules[1]), - Module_GetLeftAddress(&modules[1])}; + unsigned int addr[2] = {Module_GetRightAddress(&module), + Module_GetLeftAddress(&module)}; for (int iloop = 0; iloop < 2; ++iloop) { // get previous value to keep it if (!Feb_Interface_ReadRegister(addr[iloop], offset, ®Val)) { @@ -1444,8 +1410,8 @@ int Feb_Control_GetInterruptSubframe() { uint32_t regVal = 0; char side[2][10] = {"right", "left"}; - unsigned int addr[2] = {Module_GetRightAddress(&modules[1]), - Module_GetLeftAddress(&modules[1])}; + unsigned int addr[2] = {Module_GetRightAddress(&module), + Module_GetLeftAddress(&module)}; uint32_t value[2] = {0, 0}; for (int iloop = 0; iloop < 2; ++iloop) { if (!Feb_Interface_ReadRegister(addr[iloop], offset, ®Val)) { @@ -1470,10 +1436,10 @@ int Feb_Control_SetTop(enum TOPINDEX ind, int left, int right) { uint32_t offset = DAQ_REG_HRDWRE; unsigned int addr[2] = {0, 0}; if (left) { - addr[0] = Module_GetLeftAddress(&modules[1]); + addr[0] = Module_GetLeftAddress(&module); } if (right) { - addr[1] = Module_GetRightAddress(&modules[1]); + addr[1] = Module_GetRightAddress(&module); } char *top_names[] = {TOP_NAMES}; for (int i = 0; i < 2; ++i) { @@ -1520,8 +1486,8 @@ void Feb_Control_SetMasterVariable(int val) { Feb_control_master = val; } int Feb_Control_SetMaster(enum MASTERINDEX ind) { uint32_t offset = DAQ_REG_HRDWRE; - unsigned int addr[2] = {Module_GetLeftAddress(&modules[1]), - Module_GetRightAddress(&modules[1])}; + unsigned int addr[2] = {Module_GetLeftAddress(&module), + Module_GetRightAddress(&module)}; char *master_names[] = {MASTER_NAMES}; for (int i = 0; i < 2; ++i) { uint32_t value = 0; @@ -1589,8 +1555,8 @@ int Feb_Control_GetReadNLines() { int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { uint32_t actualOffset = offset; char side[2][10] = {"right", "left"}; - unsigned int addr[2] = {Module_GetRightAddress(&modules[1]), - Module_GetLeftAddress(&modules[1])}; + unsigned int addr[2] = {Module_GetRightAddress(&module), + Module_GetLeftAddress(&module)}; int run[2] = {0, 0}; // both registers @@ -1628,8 +1594,8 @@ int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval) { uint32_t actualOffset = offset; char side[2][10] = {"right", "left"}; - unsigned int addr[2] = {Module_GetRightAddress(&modules[1]), - Module_GetLeftAddress(&modules[1])}; + unsigned int addr[2] = {Module_GetRightAddress(&module), + Module_GetLeftAddress(&module)}; uint32_t value[2] = {0, 0}; int run[2] = {0, 0}; // both registers @@ -1995,10 +1961,10 @@ int Feb_Control_SetRateCorrectionTable(unsigned int *table) { if (Feb_Control_activated) { if (!Feb_Interface_WriteMemoryInLoops( - Module_GetLeftAddress(&modules[1]), 1, 0, 1024, + Module_GetLeftAddress(&module), 1, 0, 1024, Feb_Control_rate_correction_table) || !Feb_Interface_WriteMemoryInLoops( - Module_GetRightAddress(&modules[1]), 1, 0, 1024, + Module_GetRightAddress(&module), 1, 0, 1024, Feb_Control_rate_correction_table) || (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { LOG(logERROR, ("could not write to memory (top) " @@ -2050,8 +2016,8 @@ int Feb_Control_PrintCorrectedValues() { // A1) and then A1/65536/0.00198421639-273.15 int Feb_Control_GetLeftFPGATemp() { unsigned int temperature = 0; - Feb_Interface_ReadRegister(Module_GetLeftAddress(&modules[1]), - FEB_REG_STATUS, &temperature); + Feb_Interface_ReadRegister(Module_GetLeftAddress(&module), FEB_REG_STATUS, + &temperature); temperature = temperature >> 16; temperature = @@ -2063,8 +2029,8 @@ int Feb_Control_GetLeftFPGATemp() { int Feb_Control_GetRightFPGATemp() { unsigned int temperature = 0; - Feb_Interface_ReadRegister(Module_GetRightAddress(&modules[1]), - FEB_REG_STATUS, &temperature); + Feb_Interface_ReadRegister(Module_GetRightAddress(&module), FEB_REG_STATUS, + &temperature); temperature = temperature >> 16; temperature = ((((float)(temperature) / 65536.0f) / 0.00198421639f) - 273.15f) * @@ -2075,14 +2041,14 @@ int Feb_Control_GetRightFPGATemp() { int64_t Feb_Control_GetMeasuredPeriod() { unsigned int value = 0; - Feb_Interface_ReadRegister(Module_GetLeftAddress(&modules[1]), - MEAS_PERIOD_REG, &value); + Feb_Interface_ReadRegister(Module_GetLeftAddress(&module), MEAS_PERIOD_REG, + &value); return (int64_t)value * 10; } int64_t Feb_Control_GetSubMeasuredPeriod() { unsigned int value = 0; - Feb_Interface_ReadRegister(Module_GetLeftAddress(&modules[1]), + Feb_Interface_ReadRegister(Module_GetLeftAddress(&module), MEAS_SUBPERIOD_REG, &value); return (int64_t)value * 10; } diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index dbd946fd2..317773d25 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -4,7 +4,6 @@ #include struct Module { - unsigned int module_number; unsigned int left_address; unsigned int right_address; unsigned int idelay[4]; // ll,lr,rl,ll @@ -12,7 +11,7 @@ struct Module { int *dac; }; // module struct -void Module_Module(struct Module *mod, unsigned int number); +void Module_Module(struct Module *mod); unsigned int Module_GetBaseAddress(struct Module *mod); unsigned int Module_GetLeftAddress(struct Module *mod); unsigned int Module_GetRightAddress(struct Module *mod); @@ -25,13 +24,11 @@ int Module_SetDACValue(struct Module *mod, unsigned int i, int value); int Module_GetDACValue(struct Module *mod, unsigned int i); // setup void Feb_Control_activate(int activate); -int Feb_Control_GetModuleNumber(); void Feb_Control_FebControl(); int Feb_Control_Init(int master, int normal, int module_num); int Feb_Control_OpenSerialCommunication(); void Feb_Control_CloseSerialCommunication(); -void Feb_Control_PrintModuleList(); -void Feb_Control_AddModule(unsigned int module_number); +void Feb_Control_AddModule(); int Feb_Control_CheckSetup(); unsigned int Feb_Control_AddressToAll(); int Feb_Control_SetCommandRegister(unsigned int cmd); From 6f2413fd5d57369cc94d345d365a8e612620e6ed Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 17:11:33 +0200 Subject: [PATCH 12/28] WIP --- slsDetectorServers/eigerDetectorServer/FebControl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 59b4cd64d..bca7eb39c 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -58,7 +58,7 @@ int Feb_Control_activated = 1; int Feb_Control_hv_fd = -1; // module -void Module_Module(struct Module *mod, unsigned int number) { +void Module_Module(struct Module *mod) { mod->left_address = 0x100; mod->right_address = 0x200; mod->high_voltage = -1; From fb5b2133f53f205ddc2283502aab4bb9cdc0336e Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 17:13:49 +0200 Subject: [PATCH 13/28] WIP --- slsDetectorServers/eigerDetectorServer/FebControl.c | 13 +------------ slsDetectorServers/eigerDetectorServer/FebControl.h | 1 - 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index bca7eb39c..6a57a5e8d 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -118,7 +118,7 @@ void Feb_Control_FebControl() { int Feb_Control_Init(int master, int normal, int module_num) { Feb_control_master = master; Feb_control_normal = normal; - Feb_Control_AddModule(); + Module_Module(&module); Feb_Interface_SetAddress(Module_GetRightAddress(&module), Module_GetLeftAddress(&module)); if (Feb_Control_activated) { @@ -186,17 +186,6 @@ void Feb_Control_CloseSerialCommunication() { close(Feb_Control_hv_fd); } -void Feb_Control_AddModule() { - struct Module mod, *m; - m = &mod; - Module_Module(m); - - LOG(logDEBUG1, ("\tAdding half module number %d with " - "top base address: %d\n", - m->module_number, Module_GetBaseAddress(m))); - module = mod; -} - int Feb_Control_CheckSetup(int master) { LOG(logDEBUG1, ("Checking Set up\n")); diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index 317773d25..bf2eae136 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -28,7 +28,6 @@ void Feb_Control_FebControl(); int Feb_Control_Init(int master, int normal, int module_num); int Feb_Control_OpenSerialCommunication(); void Feb_Control_CloseSerialCommunication(); -void Feb_Control_AddModule(); int Feb_Control_CheckSetup(); unsigned int Feb_Control_AddressToAll(); int Feb_Control_SetCommandRegister(unsigned int cmd); From 807a588c4be462332d2e14378060a6e6a1037ccb Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 17:15:31 +0200 Subject: [PATCH 14/28] WIP --- .../bin/eigerDetectorServer_developer | Bin 365241 -> 353626 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index e7ec961253463ca378d8f8f4d5bd077980a568dc..70deea76caeb22b9b9b84bac70305ad887db5904 100755 GIT binary patch delta 94481 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 Px$LXnuaoya=PmqysR0PV delta 104880 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 From 3c46204b14497c05da1763bb10ca494231d1c03d Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 17:30:05 +0200 Subject: [PATCH 15/28] WIP --- slsDetectorServers/eigerDetectorServer/FebControl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 6a57a5e8d..8961bd9fe 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -663,7 +663,7 @@ int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, } int Feb_Control_SetTrimbits(unsigned int *trimbits, int top) { - LOG(logINFO, ("Setting Trimbits\n")); + LOG(logINFO, ("Setting Trimbits (top:%d)\n", top)); unsigned int trimbits_to_load_l[1024]; unsigned int trimbits_to_load_r[1024]; From 6dccf48759db6ee11b438c1219c03b0261cd8335 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 15 Jun 2020 17:37:52 +0200 Subject: [PATCH 16/28] WIP --- .../bin/eigerDetectorServer_developer | Bin 353626 -> 353642 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 70deea76caeb22b9b9b84bac70305ad887db5904..66601d6efad1f81a0da7730ba3f4efb7b8c4860a 100755 GIT binary patch delta 75118 zcmb@vaa>f#)i-`;cU4e`iva}}WDyVu5SM@vA_!JYmMm6`STVu6CYoS^4K`ZIQ|vAY zX)wVA9n8fB4L$*b2{zbh#a0{Ak_1zdU~5u+N>b907F%rbDW;~?^822-bKx%9_tW3| zdH;Yt_sqZL_c*UNPZ$R?Pz@zQoq^R{XDdBY)Bi zi^r}gQ-Y}ntL0F&qQu=S;TlC*AmM}M=s!fmAM`4UNrzG2ti!d6V$tDx@U6p*U{;4) zz^@LsDT*Ip4|RO7T~Yk?f(}KQtixSkPKSFGB~XVk@|$$HPf@1o@Bpak@Q|Ve>F^ar znI_>^6h*mNhyBohu>N3Gln@;bRg~#EY*&;SIvlSkp*rkPlrSAmSCpALoTDf<9d;^8 zxDFR6N`wv4GFyks6(w4Sy^0c}!_|rstHZU5GDnB& z6(wGW8xhMFg+&VQfHh96O`$Mz)tP?z+3>8#nAFA_wI=yVcrz0bt9YZ-e z4NB62kwbO7aB3o}<=&~wCWNOyus@uio%*Dwr^4S9TrtI5UYQ8tC|0vWnW*9X%?H2k zwb(V>gtHZ9bGi2=CBSJ>Gr(Pd#19(qQIOZLq~T}4`vc!A@!@0m7cM!mhB{?|!%%P@ z4O%5W*MNTu_&SL%GT;vZUm@|O2K+AI*Gs(DfPWnLe1Tu3Osq2$tV2PXY|vuB=K&us z@h1)V6ihxzZ9;`Vq~m|6hRQIfZ*hlukLiVw-P5w!VV*N>j%kvjT92CI`18|(*-3Ti zhb%rk%Wj>Jk??9JNq?6neMzUOom=A}&=&WnR@pX{$>$*y-N%$&UY3sJ@WY9{Xp zwgpwv6FOwF!*)IxJa=U}wMgFxW-S=#n@W!NcS>%0AJ!SHm(#+vu0g{!a<#J7qZFn? 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

~4 zj<=sgeW;@+lIMJ88>#8{3?ICJnug)OJsUMK{P$0A|7SLz&a(|QTTzn+CGGpbm#B#` zy}t#D@{?k+?RfL2*&QVabbHdr(XA=xASs;2P0GTiaex$#algMv%0Ga3~Cin~oT?JCc}ou%{yicE_I|hM4)Hjfi?%tBOKI z22W(d;3sq*PVm?Q9)?_E$EV zfQqi|hOX<;^#=y=>!B@?8be@h1szEqM=9EbN?eg^r`J)AYAp?SU%VWx?t#{@COa<6E@+bAYTjC) zb4D;%%+?bZ{{kPob=PR1*BSV*paQJ;QI3nHa|N23ZNl z^B%0^_jya4bOM50q)(bL3PfW)!)>Hb%-CV*^NTzr*9N|rlL}qEF5XI! zu14qQ^*A|aQa_p1(9gr{+`rV#acvIU$n_cKa1XgY%;BL$JoGOcl1O9F&8tTOb+ad2 z)6K#CWJ`SD_fz=0e@QSkGk*3j*Huzx;;52d4G&aO>ncr2Z(rfX1DV%TQfA?(lJ<}z zG$^Ts93hnS_IfBOfe#PF#@9h;sA&%woxvxykkP>>y&Z`tHG&s@xzyL9)ok4xSo4+3 zTFnDnJ;UvnDQ<^R>T!E8EwRx=$V*}}$Y2p$W?@3$3^KbU-(}!S&Vba2jo_7C;0tGP zK)$5sH}6ft2Pwk!t5&GezLI#*FY>L1jdVBpR#?FgPxH!4nfUxs z+ogn*^f7JLqm5xrH@}BASkpgLhwow0+Xlz+Ntf4;buF*x%iQ2vUYX4YFaK%rVZ)H! z(06DolF-?CNI+|so3Ptt6_Fhv>jjaUbEU|n3M}fEHfticC-L;Z%}cG)?G4TlwO{^J z3QJoscKDZ)G-2O(k2m~HO={3`wWx_D{07eJgKARGXw8>s>mmh6o;zvl zf&zZ9m0Vu?70k5}mvnImW!rf#%&fl1qaS>0kq8zM9MX{*fGqQ0+w$#bDq&NE8_O>kwtg zldJbr>+~|HW6v(bfFS0c40@)d0FJ|EOl#EWvf>MP%TRJ$i)Z-zHRywuv9$T7VlQn^t;d{- zc^K|hY(Ltma^y6Qp(q%5Ygph=T6X{Ip==dzlk_dk>E&PhXLMYaXSnIhK;@~qn)2E{ zrGcrd3-EU1&_9!Xg{b-%sv6ek3x`n^>$7b+c9a6mG;S+Ly+x>JFv%CTq8?1LZHBA^ z(VOB?#}K%`@EGdAz}rIb7qi>C5`JbjGCn8Bw>Q|nh6xq9b0ySkCi{G)RUbP%UW#Pg z;Tcwsg0aCaUx)-l*yXFpqYTH;-5qr+Y8dQt`)SmGUB3Dx?;BnyzW!7HSXObah%axu zsBKefG+G+M-|Y{gC05d_44xub>XzIbyzd+g;srWGq+qUSZKimJx6>IS#ckem0%MUf z&#|K(In;Em-VO9FW;=P*bX43cwiDag8%-^45h@CZ&t0CIuFhrb+zgkVw#283i}7h; zoN>03@9@fAy`EuCzQgM_w+5*NCib+iklv2MA(fyBeOwv-zL93O4o%3q>pa8TXlCo& z<`$Y+ryNlIb=u8FyL#EK9_?z-t{&}V5;=6IY}-BB_Un45oYqH~l(P(tX?>Kr&99u% z8aWmJyRIhxXRe(X!!gt?mvv!c+oDmo9CZ(k4Hzt8b5E%YggC*mu?Mjb}9|wg$62<~&#!%pSLB z)t=C5q^sUAHc@Z+y)bHd5G}_ut<^0zf7J!?$0J_ECps0e_esO306oZ|w7Au*8`;vh z!fJd@YikNVb>&tpbbLZ}*GQG-8(9o1R6B2E568iBo=L^{$-_wZvuQoX5BH;nt1c_M z+gD0gbv8bTF9V#8Zx<9f$nR1(L0*xJ4|7~g;RL+m3tK_MyM=8_3=2p)c6zV(-F0YZ zh{bB(K|8GS7goxMeLzl66Y9#9K1<(yYUNUYftI?yigX9uAx0;T7tdT!tHW7LoYOO0 zvq_f&zP->;<&3BjL{*lkJHuIWT)Ss@(`HC#*chMw7}CLSY+tALhhxs_RQn`$hYz_f zmm);aj@@;@Sd`8|=z&a$R7rXX_6$EwrUX?s()C&6Ihay-{%d(;W8koM-sSjjBC@9i%F?HP^3F zwU??)RwqQVy;SdM@oquxTG6AdHXKurM=~E(dFoRGt0+U2463q%KmKH;^-F8ECLiGHNlK;H#AT@FJ2VQ#E}z6lFbGc%Do(Qi>bAE|ad%I-2fzgBIIf>AQHKMIE6RR?zA zTD$f8`(Nm zy{Y)fzy-BuDocxghbm>*m2&(QAE%&A%5AQ1Js29pK4Yv!y%@_fS%zwlV|hOE#KuHa zzxF)xnU)@UmdWcLx+FSsgWCM;W5SRyL{UduQGJH`eUQRpC_6qOc34Es;CZAzJ!^g=$HI(0K_DE1vJ%uuCTmdtKdO-U@8^{BB)5HDJFCb4I~HjnZ-PF!T&1&Iu&oPi6F2oY7yW9W_U zii#`1Ze`&)%||oMpDQ`FYEufkO`SWPUH63F;tTs(&X<@WG$wi!#PgwvPwwr^WrK;?W?6y zZrADB#N~FWIq7WbE&oBEtdlWY?n$sDBcY9mJ{k^h`$sYoY()QYLiMLZVU_C6bhZ?K zE~c~lO}PVV;S5mE9W19m6nI}a4F-mN_IxTBV4tnpueRKZkfuV7oryt2syQ>kr%A=9 zgkng8GufZw(ElG!1UCPDoYwr?yVZ6Fdz3|}u^G%383_YP5ldj?GFD!WT8JWcMy<$z zb1GBYGr)P1+MLOzsejC18{^t=>*s19`?HHR_Lawo{bcp~v)FQWULBalY_k_!+lPye z_J~`~<${et@t2r)f28*U6rtMe$iU1Tt8}=~WO27V#KnDjN+d z)ScOAutP-7wuen)boSO-Hs6{2x0 z-=cQUh39Hgt@GIGkR~jj@!6?ADOIcHv72vs^s-nE@bh?M-voEd^k=*cXcAa^Q?OI* zp2uc}>_l^{zOS8Chvu<_5F`$8Yuj9&t)}EKPl#QV9$lEFR_Cy^q~9-lGD>*W`i%yYwoU$3FSOUw+_n{tmUz#cbJq|Kj7F{bE-R z{CKCvP7}0We7rNf&v?7eGdw@~VDSPRtYDXpg^bfGIJrB}sDJr|W`YkOU|)#U*4e96nH7T%6t ziqs1H38Va?TbA6T?xd1RwUbKdNJdd5^?|?@+rFPxHo?eWckM?O-R6?wo-+|1dA+%e)pX?j^&^~kpyIw8M6Y%czHR?`8 z_z}5cCFUPe>)p(j+A2?Ml{KhNEHmu+eW>O(&YIi2>Z)3DCrb$HpoOaik*mYh`a5x; zp0=1Ri(fECs#AedeWONgSd2ORLfyBREnOqhYiUTO;dA>&nfkRH%7;q=?V)!E#sVj| zN~R1Hqp(BQ3R|*X6ZX`ou&Xv5gs?Z65QsDvAU-~&9x8ydKBe|+e}b35v`(r1CD;~E zsTY?()>CTm*Tu}Ge4V|)PO1e{aSzy)j8848)}`1K6}50Fs-08Im!dpYjV;6zg0e!a zX6)>R%oBZbV=BHTSXumud>y2pcB@`k2G8nL3zne?Jn}O3K;%jKO5vJ3rDAJ5zGhU+ z(V|MVe;Hgi_M^M-2OZu;9Ud&dizS=a#KIo2!TppRnjz!%9yv59YuPURMfrtRl+%Uf z2pQ#ShZpbdWZ%?&3(5^!T-T>)2m4;OO1-okp4%&Axo~@>ntl&&A^JJ$#~w3@h)QC7NVQ5I(JB8)l=*PaX>trSq^R%930R*bwyIcz{gX z;l2Hontm@P6=|+}5x**GGd*opyY6K%q3x)Hmk+HSSUr4cNg~I`%dlocj`!JFYHMj)Jw^>au!E86HRV8rn?P^B} zGCK%re!K><8v^#j`yo35_B#>Zu41po70c@*1~rQ7BT(aF#H6d3is+*H8|Vn(`Zw5% zl=?WF0iG#j_S)ng+z6g2ZnK-Ig{u)L^{W?GqrqY|*b7;#YQ7gc5JCqpTN+)p|eUBmL94MC-rfes(um(}7iJX^0Tt+KZO(ZTT|}CO*Jk zVK@=>lwu&O4qhr{_~5ZsZGH%kIFCHUKI4CQF+zR!VOF)WI0tvvycVlTd}EM#{$g+q z#)_kF2$8=+pkJ0q5BzG*JL&=tS3c4xQR^{y#H-Cxe8F~8bd&Jxzt;&wl! z1cdk*UXNvz+sLo>Shb!#`H(_voesrQusct2E>E@0&vjYHJ0JP^N&0pzdQnA5SGRed z+~$9NQZ0Op#Y7_eWTquy!h0q9br;0M*;iEmV{D4A=>MM{=WYcbq?&(@^WfDlVV4Gv zGn5PCgU88Ug3HKtw0dcu!hQAtpnTaaU@KZpZ>nLNsewE3n zjsHs-&JZyaOto530WW`qALj}5D^3OCo9_`(e$crw4Y_}u%rLM1zzFZQb*g8*9IHfNkhy_2$Dwd$v)$j*x&f+9U3=J+ZDP2IAo8%;N&sT)nVpdPJBs@I?% zN7LmGf>a_&O%U)5nik5Yg=jhhO$*U9*Q1xycu;5pl*?@TZFm{b&F6Jd7p2y z4XH=5o+`;c&?Ly=--8dVPYuJG39eRdt*BO5V=mTN_FDKLaz1hYoAU`)9UIt`XtL(O z?`aULZBMZ3-M}7>jQ&^5Q`L9A#llSJDWZzqo$(|IBrgsGEJ|!;0oxh`#9I5hTWzYs zVRZ-C<0nwY$lhDU<}CQ%WQXH4esPlKIJMsOE&A3twXl%I9`ruRUJ5cLUwOgDV#a=F z>UAY6QC&WS@?WZ6{Q0+9G^#B=gl(JE9{l;YTJ)+`Kk_*7q+Iy#7ECx^7bJ(MEYr*@h#P6MOJXv_QKEG~$4JXuqF4kTG>T~0L*&n; zv<^as2uaiL4iC~dUmV1TUo*{dFvQ=}%hymCBYjmaUQ?WQQT-!4uAM&mf7t zbU+QQ!z0q`btsHb8|i6>dWfE!YV2k_VNqofQPtZR-)v4*v;tA)JXA!!$snzs^ z^zO6liTG2HGQu<5{~n}tODVCKKMMoKVvdbdvz|jZS2(CvK8IEi^EsR+9qRe#U=cX$ z)MH;SRK4{qA?O(9&dNhOQq`+pXA{-Vdc3Ijt3CBBEnCUXQ$qDmhr^97hiZ`xSyqL` z8;TF}jCVeYa8CchQgh4_l#9ShP2YmuHUvLN6N_&*ntE&NAZ>-1uvnTL`Mym5vd>`8 z@G$Mu`l|Eu_D5{|@o&WOiUx~%af^`W_`{~D)Bdu>SPd-c`#kGKrwX=s$M-NegpuF- z_ZG;q2DO1&VB+bIUp@Xk<_kFrc4kM{vQujD^X$iLl^W5&UZud{qa^iA1AFZLWkb+$ zigrGkOkR!*zld68cHKoEeGYb;CoiWhkLr#5n5ua){pMmyfJV)eH;UerWkcjCCC@c# z`&Jec9;_=Kmq60p=7`JcsjaxPfG=Mk`|9~_jb_{>mAgX8xoU@kNNha%tLM8C4fI?{ zPD>2Oox5BHdJ^cTB)!N$4|6LcKQw(;*=Ruo_EY^BbeG{>bp*B}{TOtY;Z=3S5zwn; z2ZmSG5&JWJ;2Ydhx(rMJXJ&T{9_Gz1?|Lzt{ z5Z2;9H^CMRS<#^rn12M@laQht-;5Iih1Hs~LNXY?1xgAq1i*W&Bjw_XOG`a$B8*N! zZgVX_@dTQk*>vn^88XScJs=yr6V=QHVamIEf(g75BBySBrK){pcd`&2J(XUWkg z!P0nVQ*VV_&IbDQc1yYU6TS0QP|%}fr!GaaAqo-8R>@CDGZFzZ(ONX zp@Q zCS*A4)bmYjmg$D8YU~a+C*%mJF~eR|ua@j!Q++pFLElAKyLI}abenJ30$Lp{0=GGA znW4uPEoFPLSn*U#hQ5*eUBDL467bsXoHN!En@fqW&tk zdU*%C`N2@qq>N1b()r=`F^!m&xRppc*6P1St4A*BG!BQi=s4cbQ*tLq@~5D8JNW0g z&7o%?4`sNh-bJFxaAFfl&C689;<=A>-x@Z z!VJy1O{meFTZs0ph4&QE#hRtQ=4&^Ubs8;TL%FBXt%P;TUR!|MB|Ze)BJoM!CW!}t z>ovT>0_>L(i}V4t!AQDf*?t)MsCF4Qe?3UH3Z`M?f|y}*eQ zR|7{$+yopdaT~BAF*=@jNn&3Q9?r{$KHyUlUjja^;d|i+CU#4l2z*FlC-6Rr3xJy? zhCmY=C5Au~>m-Ii6RRcO2V9Y(_}~(hd%N&ZDho~m7fXB|xIn}A1p~VzwgYELoCBO9 zaS?E=#AU!%iT%J9i5uO@gh7d$k=UJZQ9eMT3H=gx0-ux^Q!}AQ;?CJUN@OC&x7TqyBz;CzWm2&cq@!08%Z zg=v~#mpBDDLSiRyu*8_AkRgdnfPDkgC5AvDeG)eT_eu;6g>*^W1Kc4o1PW=> z@HZ^LJ0(s8Zjd-1xK`p);3^IKzEO*Za#_#&1Y0FO3v7{i(5;Lg1omO{Yl87`Q7c$u2kw{H34BuGLf{^Wp`r1e5<^4d z+a+!QZjrbRxJhDYWqiHFn7;9TiO<9TkFS&uLntWI@cmZc5{VOm3neCj@+B?+c1r98 zPM5e6*e-D$aD>Foz`+t9ax3G81okQSLq+2TWC0`^cUEEuG_Fs>4?v)Cy%Iy9aa|Ha zpm7}%L!fbO5<{SIJ0-3HZjcxn8docE3viY6{|}Hv<+6YT@=8ns6-i72xiwr$0_8}Y z4(yQF1)L~x5pa~mrNE&QLqp>fiG5H}&?Wh>6ZpKu9l)m~?gc(BaX)ak#Fu~%Y52iV z;C&L?ftw}H0&bMJ5V%g_a^Py|{~z?@p+Xik0+&kM23#z0Cvbtp&`^*|;{jS=uFr zhAb@-4+1x7_+bcSsh1cUviJ$Z|393Lhe}!C0xpxd2)IOI60T6w%pT?*mSk zxC_`WaUXDm#20~sHCz^qvyyK}KESHY0}?|B^I3_@fcqq_1@4u&8MsU0Zr~1y&jYt< zc&!4wQ{pJ#28pwPYc=d!3!^Ys$$|>ta)}#(y%Iy!<|2tP_hz@mn0xsWKv{bU*rCxM zu>vPboDLi%u^Tv4;!R8j=OozylJaGv%zr9l(7Oqcf#fVoa0LB{4=O zzNrryt-v(tKloRHj>WGq5Zw*jpw+LyG%2;x|5sq1wAY`g)C^oMD;)y%O56urB=I1y zTf^%xN^wj_2kR1n9g^+>PL#L=I7;Fw;82NKJ-#UDmReL>9TYK>$02#)@3;bJR%FeO5}%cuq0n+uH9Pr{EnQdL@8k^#dBt{w{@*3CL4F{kb9x744+eq$V3+mfqSN{RK^L^p zP~V5S|Kmm3fQ-z*=wgbb7YEY6D3$b*G4w%6Cm&?s^QA6m=@|N@>WMzO-ywb=)zIL7 znk1w0zy^QqlJtr|`XybU%0T*Maf<@{s{-j?>9$o(Te_j+uR3K1wCD}=zquv7HjqB3 zNP68EdcCCA2hy+POL~J&_vMP^_xDCw(5M$^^da3?ngZ!pbw)b_>HpMMM{^*3I7jkt z8AJCC$%3}P0!8n5Um)G2kE}hAZgxmM9f9i< z=FS@FzU!H1N=G_FgO~zY5E0lQRxUpl6-bZE zm-S-<>C@y?ig3=rA3u*MY=R|@)c1+yXB&_ODI*1fZf}?L^gw#N-mxQ)ezQf^&l*E- zl5}SvJ)zPk3vvPr66M@8S0EiO#R|U|0sdJpNpgN!+bFA8sca6UFFY>!w1Dn2ERTG-39+`o28;9&>38S@=omxqlpP-$rTZxOT&$0vbF_fycjn6mU1R9_2)YC59(@2kf%Jl6$)`7vUg)p( zY0K$&V8OB>+2CX#y+|Kf-xzw6tbZzyeov*O_XpBfR7v_-I?@@Y;NA{da6XW}+AHZ7 z1L@^{NgoKLKh`hlmjdbE)HOXQ>3aPCxXx%Ou)%|M8YA(gf(Ah!l2ah^0tWiSl8-4k zkWZN$u_-i=?yHE99asYk)=AZwA_D2(vdj8Wf%GSIKCyxHwQ|Z#_CWe01%i(+&6GH% zK+e6$iWo-r=q1^4dSLx0+9cf(NUuC4=~;pF^|~gUL^s6$-`*!1rD0p)>k_#eD%>RmIlt*|X14K+uhWf}k7}1r+3|8?v;H4Uirm&@6aHl|&=Ls(} z3HS;xc$I+X8{oKf!Coose^%g`usKQ;DD;Hi?IYmpz2JHUMV|0`@lPxvD`yw(d|rVC4*XTmnUkN0}Qx9h@K?+M?bbFRS?UZv;XZ-7I# zvIM+L^@bXT*#aF=lc4}Ow4*|_tl1M@T_oTwUhrN4Kj;bP5IR~HuvQf=?0-~HlPeP1 zJPXvc3;0n__~YdQe%urOnBJ8qJmF8Yiu_I^9QOYcy5?#(CZxpf%o7DVyx=_o-suV7 z)gs_sp73Y&zVG&e??isG|5=Y`Lj6*KsMiZFWCEUW_oM~RJtsIMn?2#ri%}r^c*0-U zqTwg+`lNx`4~QB>i)F>LKtnsvdsAAo(he|oPL@#p1MWK7)ROJ`Tt7H4GZ zo~$@(5o#&$s>O<0LU4N+)f5T0U5vPV}dGp&iw?)TGGjM>}lDSJiGPu#qyWW-}#?r>OgIWU((JQFk~5;tT9VsDn z2|#(MkUnyhDq0DDurq}>zaxdkr=b!$-#f5(8GQ_{e>s*2AQyDTZdWmi0_I%BeGcMS z3{Hj|#5O@}mOqHI&^BH|F>ISYh>IRbY@p5FK3aVU=L{tGR!nt+c!-*6r~Su=(2@*9 z#df(py@U2hvoHG8?2s{DdI&v=Dh^3kc~miK+DQwx8sZG5+(Fw7u?1B7>?k{NHYHu| z`X}&XeBQg#br6aAcfIHxHT?6lDn;7So^sxN76;TXdrw;6Stt8^C2yX2-H1&pixg?b8ZAd{|l*Nt^5F3u``U=-%XY8||6{|9lDts42UD z%Y1H&VqpQYt#)Gtou0x$k!{tjxEbZ5_q{0^b^OK@9F9oIaJjaD8{4kIZvFmCPVwgV zrJLL&pi4#te{yJW&Wri$?@KZKp%0{7&)lOv89O+4RxnrEq&q!xvX5`%^=;k^Wyj9) zxFdt1H}c${aTUzFN2HBjXpX+j3qJHF+VAK@jjMMS;kMr}KKdi6G`Mu|+k-nx`QDGD zZ={{P;wa?B&i5Y0%_=*17h=JCH6DKd3|?gxLZE}P`|mi+t;eM4@pg=XWZE4nj%`MX zKHQI=racnq< zcwifd4as6h;(64^(v)}_VGyu8>|VtALuCdfJAF*ZY8W^lqv`6&TS%IA$PUL+v->wZ z$Ll}F%{nT!>CJaE1ElI49V<;CPz5Sh_1qpiLdShnMOXca6c(8T@l_9NVltsGG~w0P z&09e#ofX0FTP2?Qi8MEbv?DgM-ii6<0PWhPea|%i;22s9?b?mXVjnyQR6Zp2$UE?= zi8p>CT|S@QPOT@fy2VYp&pUt?OUfoUf+rkxlxe&3Df86nVrBTq{4 z*dI=9T&Cl1B{?(Vr{l|6>|KMs@Vb}1@ONP^9NM=zT|F2Ygz~s?d=tK7a}qnyH{ljL zHj1A)>8t2JbP{4+fww{HZy>lx5_o5Cvy;KR-#+q`T&W`bGB;5&i~0{*9sL z!hxEVcIm3+sQI-d&!PUe&8Qhe{hhI*W*^i{1P}D3sJRW;Q>bR7+p_zszY@RW0H4o` zoVa*nA5h^_jBn#)l~X4Ig1IG4=q>JaN@0mRRGKiu;;SpP=iP89RQ-sG6&Mm#0x)e?ki08xX$D&+-`J`@BK=evivp3Yd)EwDl*LO+5J}?8hFb*1gninb@uH3wWn$L zgP+M_AGW4uYd0O$H1k)&96dnC$3Xf4T=(|1alYr3UtUmiB_*J2l1ufNMV_z6sdRpQHabaZyuv}x2u=&yL-1ql{4f=?{2^GU-d33 zS>G;&EjeW9NU}J+E18kq|L7^vc~<=1Dt?FK_c`&Kj?{;!R(^l}X@0yN{I~O-b{qtu zZ3ECDZ^q&YlkUw(wFWTUKBUgRy=Y_vkN8lE^3+l6jg7qalyoOfaoAR}(Pct6ZR$)L zJfU6eIibBlk{~SIS5Bcb4VLc9i5e}teO*#0X|5_C)j7JN;R1Z zh$h}FnyqY3*G8Xyj0Ba#7P@PmCM_qRcRqtL#J)9Z1>W_oG&pWgOuZj2Hw_#sRcXGbVg?%E=xydk9p{zy* z>`;6n6a(C*o?NHfMiA;ZvN`z;{DU{<`i1Y|(h zyoObdx=lzJ;&qka2Avfo!O&)1F@mYdHdC1`ZIGbwGe1a5*=wI_gxAJU4t>d(#s0nk za3MA?(HR)S~jO(D<;f5kztv)%*@f0aITrk;&MBhS;w@LC>BZaj=n0|dKC{JlXDdvah< z#NwRo_fqt_-x&+9ZgY44^J_t^VJy^(S*mfNdn{bP&RzRI8w-=ya@!A57>WPn`8*dt zBY#Ky8)-GC3LdXOwiH!ss3ylH@y={2MYfNRqkj z4A!QQAz%tvP8E`?NS%1i=LW60UWO_^2Yp9F6?ekX#9NlgTh4j+`>6e&4qnF1TS&{p zN&JoudFclC7~)+&WBxxxYe()44dgz*81t&_ zc;Q}co%!M~#&srd?g5&^Jg3K4K!av#1%B=^7Ep0L_W-Z_Rk}`FFhLDE)2xFQfZ3k& z<#RU$n zh>S}^>va`Ri$7X+!Cz;^ZU0!&)zf-isQg;Ggg-{C`fzmhNxFm|{;I!V>tydBN&QRw zU@=Myt?u*Y7kdW%(I>50w`rgWVsVHj1foVCG{GNK7%eVpL7r#eGMBd$RTw3xX7es6uuZ+Yh>3Nq?n0DCM=-?xR z8#yOa9gaKhW(IE)WtQT1bh7&w(ikW4s82I+9^Wbs&fl}~;ne1@w&cJ4`deA-X@lkQ z1X&)2x#2OgJTN!x!Hsni8@=G=!K_Q!haw7C7li75k9F-}ofWJbusFDtvC+OHz?!zr zU~CMlJI_}zW|#tbGjauI4sLqNX-yN2l-V-FxGs{>_-(vgW|vEE@DnmytR|YL+c(GX z8D_Q}dh(!|Mfg52P;r-;g_Y46)SVzP1|-Ij@kn1T$nKx{>fq+i+J)wZpt<3{-`vgh zI`duqUAMhZ%{$XED$WxMKYWLo@kt52&hsAA3&ooIV=Bmc=Vx-WrUHyET~D zIBbuA^Mu}u^iNn$Ues}8Hg{^vhL<-(I&`nAIeFdPCZ02#87GQ&t-4zN83so&(c&fxZJk@&D?6pb-MX_{Mj3YvA z*^cu(Dv&K+s9*7stcoI(8NS;}Z?bd;xyL;&;#!a{;SXqqh|)VFH81Xh>Ez9UZ04nV zx>BIz^z~D=>#ilVluWZK)bPF9!t5d4fD|9Act9ACJIDtS1Ds}C{@qPHVD!Nzv2q9`GR~Edx`N_uYA{NZi2gkprp z;nCNCOI`P9Ru}G_AO>gdR+;)j8b=RO zhYv$Lg|ORI4=MP2Pf40#cEh!C=~?U%Izyq&Dst&f@7E|4;y!YxQbE55??o!s(Bd_QBb+Hx2|pOl{_K_U z0h-c~5pR)-#<6Mq-LcH@qKW5@LrwdPSzho$a6k0{F;u1Fa{fdFvwLP?_np+{oYhv3 zIfrJF`^NHKt5Gql&At~FS0sDV3(XeT&lD*F=cweC|KVsET>fB-BMqRkeS3!KxGDz`_oDX>rKqfr;` zsERh$Mcf>6*RfEOzvXm$B&th5Td@K=XEc31@yFbMjBgAbod-_|ph$gxn*!h#$VzjPdGU~)Vxs%oT zuxql1x{rfBv1hP7F-zDJ&rk8t`p6BdrfoVK$7jajJ0(?oMI1!p7%z=uVM&h-P%Mmm zQ1m<2>6XScs1SNH$6Ha<_ZgK{#Gx*Vl5rT5-9P6P&zQzWu`Ny>7wv zCV(q@G_Ir^(YSJN32#jp#Fg6)xw(=OOI(T2zw7Y!QNkO|Zab&r&33J)>Bhj6>(6OS zxoxY;l+SE~n6lxR#+22GU`h)wPh=66XR=*ay^8Ohuu(IU|0fOZ)Emr|>1>SOhD|zQ zJbW4&Oimhz!7R1GqjAw(-n2pOElzW{cb3}TaenvNjCjK)uGP_IyRN5C_Ziw-NT2S5 z5ESE5y6MbwXT&IW>jG-)+=+Rb6}HaH3cF5NVYiOWb}f(B+CTGu(Ej`EI-S%p3G5a_ z#}rb>7-qw3sber3-m+C=N|InoJ#U|3WD3tsVxt50xtWrrGo{s7*)Vo9O+MO;-JAps zu|e(dACtU0d`!`6x;qjzTS0}Uu;Iw!#WSHl?Ywp-o9i{<6a{nhtU>&|X@|Bx_{%Jh znbMXFy@K}8+sZ#Cvn9AYu{oKAsk@snL)_OxhJ-L?6i|&R^L`%?<1c>Gn@G=_``Arn z!D+3trm(O`vNMbxY8s~Pu(QQ5O<2HJAe;LB5jEa#RZE-DMB(b|LMly1v+>B_F|&;` zAk7q)u3wk!x@@1pDcTCh|Js4U|NFB=9W??~E*+@SxtiT%(P&>k2le49sX2q@iyQE5 zG1}cSIn{%e4XI$|5-sU_k0jMPShrP6dNIvdN=+(+iEttNFRy+qv}grpryC3K=5$np zC15(s4iMJ2miGDj~9JWLVZJ--FM_G?nL(av~Mh#YSBGjS?t=URHkBH$#$)v!D|>$SJL3c zfV!4^M+4RHj7-?!p`{N_D51XFmTn5!2KQ5T-_c{dD3dMLBn0ho>NWAUOxPp_?*Y2-P2Queh#76n8{Z%K6+b=?He7y1^j}D#-zmJsdx^#g-p0FKc@}2>C`u!P} zRhB}%Tpa8tg3ycN0 z3Wb-M3jDmlSU|1&0(?l zmR5HT+KZd67qVHp06n0%J9D9DXD+7BG>G*g>P(3Ba&+cGmN540zY-aI1VvYRHq!(1 zs1h1HJY*592I^c*3uP=~V@Bnjr?)>^hd)p;Ku^&k7M5tyvu3*%y$X5^`!p6>Ko9n5 zPBCTv$6OBahc>^ImO=)x&sqk?LF_L-ho%%~_nWuz zhCA8V#o~<#a1gFmOc5bQV}V|Z(6Tg(Eqz1hNw#aj4j?zk@FiaXIb`_qP5kKP-n}yX zGTq|FeiL~YU$NBNHei<}X&hk7SQLA(hsP{q5o3L`UCE&a{oX~iX^RGSn8&Sj56p)` z(sUWETn4V4a#MQAW1ei7e@bJ+5^|t|4eSkK!-NIuESzY4Xx{HL;IbtKwB(90Fkn8p zV!(hU_*~x~1~DKPUj)_{V$h|ne_+u|#I*lVsZP3K+P}6KR)rAyVii}C*P3b=UNxKADgE0)LPv02OY>N}}=-5yA;m9Xt{v0;SIBjp(< zmW1%I%_Zd-m&F$CgRW~={T_YC=|*Zu8tnivy}=vv*bONfJ2NV582L7^R5ecB4#i9j2Z#d7dH!z%{~M^5N~aP;*jasR8Bw#yI0aci=Ql&tL9Rcwtg zdF!ttZK8Jf7gu2|P{nO4umh@w&4-W+W73~N<8lM z7`-ir8}S7w79Fq_wr(7d z;C;Z>HXd>{iwFo!eqBA2V74`H?dJ2YX4$F-PQy`iHCAOEyaiA^lxvvxF7Qk64(b~C zhJtwSHJ}%lyyvroz$yqTt**rD2{bA{A20R#`2Ku0D^V5s>CF$Pf=6(kED9vm1)|i^ zP~Uxl?mGuCI?wGI_;}qIB%g0v|oc{;5uK86Lv(E)i5k3 zg4q%nbX?1YOacB_G|6>FfGKh+AUSG8-6DPIGFhSZHp zhCu+MJOywr%`+afaVIcJ%eFghsXV!WU6Ay~z|8L6(`BLEZuX(-?kalKv6HYQS|6bf z)81Xd$GAB2C=rmnu2#Fvon3T9O;*=G$!oy?gKC|*k9snTU4&gd>IFR@>JhMgEel&P z5yfbLnY3@y*Ht154OVT?X%}x-B2Go-WxHmb2Wom#L%hYCnwgnEjW;!!C%N;Sligr}~R8B7{RMNtbGDuDaHHb{(1C zCp3)DK(4s!SeaL?=?k@5&s@h+B5O2%PLe*`h_`Cf#cY#~X|8aP^Ws9xG=+n#{xqyX z*1=wDCPT@=IUyWU7Iw_ndj2W}oj@80W;^m5w`s@0@&>Dn8>r4zjN z2B3r8dBY&GX5;0|`axvPUdZ!{;2!vKJ=PQ^9)2Unc_7cYQKhZ$M!a(B;5% zZyi*8`b140Mi#>=t>DSUcpEnjZ{vzpn(W1D@6{H2^q#T-y?1U|&#_yjoE_URG{2R?qYAP_e4^ zeDxiuK7=>jf#MtZi94XgVAgNa?bbx=wiy_ZnsO3ew2C{)*RNS04!k{vX{w%-fhOCw z6xPS@*yeE?RYXu@)upH+*UTIIni(|l(CC0+}5LMw6R_qElg;%=zwfjfZ?#9 zdVoWFvEBF5KAvwMM8G87ukMrG_tG;O0Yf$qB4FY(yl69<8yTY2A4V%Dnq-7V4W*S6 zCYgyC?VAV5R}>D0+-;OEYPw%k3Ya$VS~ZAgJcMH3x#>749b$EP}td#T$cPQl2*4q` zoHvw1)|+^1Ihzo;3eBvf&QYiAz9UK153tb_TVZMrT2)}zASUw&vP!k8Qy*YshL8Of z7}TR>aKY~31rM;>y{6o;W9baTL>~DdyEr9W6OiNs-fb6_9KBe8sI_e*yAlpwGHlR@ z?aBB&kT=i$!l>DvB4Thns@)QXO#u%La=DFJs}&UQ_8}NGo<#eFk|%cnbs|5smEGme zf=}_FTlcxMJPZptmA5<$>A**AA2y0O&wa!*?<0fA8Fk8ooGU6>FLq!o-G*rb?^L&W z=Vw8f>mNl`IDYvkTZ1<*2Onj0NY=L9=o?i>(FOM!iJZ*e-i~Rqig#^CaeVQq%1Eio zu#xxj{3mEusWOfed~^jG9}dzT#&N1aGfDTrLAnF;Kr;`ohCU7EsnvrpD=T?ZwMTIq z2U2{pgd3-2u0qqe?J*2$R%4_>C2;sAzO%+yK!pZitKMVGd%r^fdjBz~r4yRe$-$m# zNm`|;CI3FY^zlLT`eWPO<3@U`cY<745l%_ zUA%1%)}Qh8h~RUcW;Q86{q1<@X|~i1!@>C%2+We|XW1og=J4ES!Rmdy@L6N8XwXF3 z^*xqb>e(Hh1xB&ou*JUK*bh`}L&7(^61j|%reG_`li{oft)5Y7HGk*a7)=U?Mh z``Aro>j&?m+@ZnT*RK+t?hn66=i&TQzm7%la&jNhyptuJUk8odEogRsq)Ix!1n?6A z-e}05g3F9eEh3@SkPwLi^#bnxNR@P+_Rd!cxcehjQa3qeOEvfob<3wlQ1_>RizWPy za5w($HvrF3^Iu`wp*p}s0kR#*szl3n%rg|&26(uD=NaG|J!c#7;U1~mce{-*k)`gH zkB&@}r614Z<5&|cW}AJ-PWpt*jP1^|W^(g|9!`|)o4Z-}zmzm#0 zHL9Lk6rVq{4+E3XSy|G#V7&SA7P6(>1EHTcUjR! z$Gyv9wHj0rgb%0I7gzk!2Z6^yq<|+&>bh6Bf#93k;Vi5BuB7b1PbKy*`D_QXj{M=g zaFgsGXwP~Fn-cH8DOOZsXhx~{5N|EmK$U2wS9Kh3aiDqY1~7mlw}Z8XjVvPGp6&YW zv=~3)x|Cm&wDI%3@aw2|mxD3rOXsUBoVPWyVNxAG(TJ7Eat&$S&gxh3x|tZPW&}%O z^o~ifx?H8I!$Y&!s2`C#m@j{o4Tl4*@KwyGLA>HsHYIkzZBl~HQUJ4qf`IgLO1pJxLIKnypylt6PCgJnI<+B*FYR^ zLVFskU&B0@WatAoEkJLF=xKxF%u{+Ep7k2LuB>gaf~?VC9tx7XKTsu|#`%3+LGn(w zx;RZci-m%$G3cq&wDU?R$Qpy5I*q+J0}8Unpr=l6Kmnm3YYcko^h&^mf~+yMy{FQ`C%Jd(~0X%w7+W8XS4=vk?}l&QbUg`}_i_)iLi|I3A>Y z$Nnz%)&+R&S7Meg!MU7fvwT1NQCSvwP2@7Wg#9-@^3%zYCS{S`WK}FtF^W`GqsZoB zMYhB^+AOjx#W%S6d=DZx5qeyGehNYiLIy$}LJ>kaLM=k$D?{ak5o7CJeaYUT6tD_} zosOJQ@=HGPZLYp6J6wHNnGiw{YzSEh`3NNll?Zzgnh}my50x_<>m%grr1)G{UqK;) z9iaxH0pTEm6QRe|w^l)jLC8SJdnHmXlj6%=eYe&kG$OPibh!G8O$Z?fHiRsMe1sB& zO0}xa@p6@g`I#IK#>fl(eCri?S|dUecTSUEpy>4V2*q5vL>}dMe!9G4NPN4i??kVw z?_>}{9Kt+=6$r%$X!prFgeHWe2%V0i*>W`V1(MVfgi>CcDnConv={`NV`-Xvc|d%( ztKaI65QUJ6uoPiE!WM*`2>TIQ5!w-Yt0U!1M{u_Myi|77)gN2v8KPHc@#q<@{+Lej zyWTU;pfbJ4n}dM*z0>|xyzE~k{$EcE8bn-~C$-?*|7oQ$#lMdu20h`4Kg1Idjqaih zF)fa~Me97RCaWS9}c5oRFdsNz_Dx%>i)Kkn+E-{tDR z*ayLikc^Ov0NfYb5o!<`5Dp?Z)pB)zkVk|$95>6O<+7PTJGUQkC zTmEEZ{C<}!ycMAxq1WXa8-x&tFb`n`LNP)GLLEYrrsH?Wzp!}Zort^>k#{2UPDI{` z$U6~vCnE2}CWNC1oi5iTGglsyZ!J??u9;B?ZxfZp%T#J#oxL$kaTHSFTzSIfx)Ow{0hJEK={LcVo(G=j;mV~_S(rQrlG2DU%GFz3fG1iR z+l418otlC7x&AKK^maT!)U0qkfgsrjPqZkx8_z9h8S+cuMrIwJtuEI^W;~rP*W7t{ zcDr2jfQR|GTsduc+FY)sNM|5^nH7r~R^f8}fil#(Tq}T>^}1XI^(K6x$>mxbf@db8i3{DcZbV$ zc@2--C11&wn|b*z8JmJoV7*p~+Q95C*D5f{)NFuNxm>G(-qd7(?RB}%<5ABO=uyHK z(<7YUM2~X*2tBg+3-mDa5B@BVV^S~wfubk)h`o3e@r1qdBe?MC^}X_VUz~M)vjrTB z=JuattK;E%c?aW9J}WP`s42YfS-H@+MPYBDOW65=Oy4kz3goxFfb{i9$AGcCGms7> zJ6{A6HHH87qI|z^x58TTakg~3F;n_0a)Cun;d@_^Z?WVn>|lcud6VNtOnMy`RgUdR=}+{9Ms2cP+1k#8}>v;uQ97IDVSnSAY5t z^zZcZFo~4qW%_xjf--cgKQrj(8TF?>{rrJ`zE@0n_o&buzUK}3ufDkoI|307Ji;5! z%75a1Z^?>fDZzNeTk=oiOFES0h(NhP=v&*_~(ZqLO~#{n3udSw~C(& zK9IKzNd>ppActCt6?SqzAJK+v+D~Vjd=mzD?h!fMQjXk}{N^L_Wxo3r z_CCmxMu+>#sX0ugbeG%emv2{GtWz|Gt?2@nh7QK|dYyKas;#q58Jm zaqV$=vt+4KSZ5sX{8WCOIPya!Z}<$k)t`?0KbJ3*d@B{!RS!*4OCp-i15V11SX7wf zsgv@>5=ryVCA{+st!Y1(INth_D(O<#ITLSp%FVv0}bA0-ZJVsg`1wqi5^vhEG)R^>396?nk_4d+Fl}SB? zltE?EFHZWYGU=C{^ivhE-;PsWl}W#J@|;uhE56~VzT9L=cz`#3E5FY_{cm}gMTPOx z|1G}@sgO-syzyK4r1<%GhkV8t(}-j?nG%22XkL5F)`_p)8ET}lJ5!lJs{6By~@0(hA3vVDn)nwK#qqZ9c-J^^W(( znBQYkw}X$RXTD>N)qJG{AI{$+%}KJfl-IT`}fR zNh)w4$36)qFP&n(P?mxm4@@PGC}rui(Ww=INNf_vV=A zVE%5;G0(yf4_}DK3BGh8fW^F$Vlj?`3(b!_iL7~N%@LLwlWeKsrDx3(d>iqz5#Bm% z?4pz+ll*uQZ$*kF&Llq($Ggv(#}C=nYm#AXgntjP*(C2a^Lg~sA3y#1dits0r^2h~ zXAFME@TTukZg&rU_waU+qfX)eKWI7XaBB+v+-s8S>i7!!X;pu2p`Rt{&-x$C(ePm( zrN?``mmX7iR2Lqbc@8~NcriV)_)dB>@fLba;GOiii3goCPhzKCJoOx+BX|Kl8hHgh zO8EYB=FiJ&pu$Wt_Ce4Sq69vu@c=FUIHXjK57**P#EJL_H4gJj#1$>R8^c7+kAVk# z=G`h@;D@$S<7z&{FVNzvcgN5V0D?3C*rmmTwRoLgV3dgK`A3WRUV5T@h!%g^D&nD9 z{283s|H=IRc#Tj=HIYq`AWS6`aUwK<2<7?R=7>N$q7uMk@LZ*spV`7IyUmNC}oVV6yB>Mm3R-KQLb&;}wrbb7Q#mS98P?@LrmMCZm<|HHvu;8e}qqp+G0! zh-@mCtR@rsQZ7My7Ser0`X0q}7)hoEQT~8BdsY5wPKc}pxK4ok6?0t%;)E7mZXTvc zDP7!&+RGZC+YgRpRJ-{?g-y)^HT7CC^HnHTVkmaKB7F#|Ocf&iE=4*|>3aN0%_cN; z3VeT7m|r;31sUeQDds0L5U&LpXpOm5F^&AO6J{01yd%LQ}~?N*piK1x?&S$?gAhS5{1zdf2=@yw}`)_u!t_i$znof zJ}|THi$T0a#J@mKHyZGLr%20+fKN2Vr&}>k+tcFC;5$TNHZ$U)0^bRWbfOjo3N?hj zi6F3xTl>*y!kZ_+>lEp;rRc025r@r!y+bCpU&J3!OmEloA{5I6`MMzb9#N#o+GP<|3QmlHVH002Qm%YV%vKn4b?p+zNSws`9&4 zF&$F4&1FsxBxZ}o`+cFX3kta11u0174K8$NK5wH(G4FDjr>?H+cGoeiUXix0KwL0l z*xwaX7f3U0(dr!bAvkSETnxowA1kaR4)IEnej4fE{6P9I3VXbKhusnpxE|0(Etmg7 ztW{U+Xs{$m`8%AJh{STFHEWXY-=s*D)M~rPdqgqy`6FH~;;3Oy5VuK|h{%Hg3+4nQ zD69-T)<;6Xg~%4di;xX#=}OA2fWtz-0;(11D(e3@4Qari6w{BXybakhZRjYc0Dr2m z(i~)~67la8(|f%@6D8t(3Y!VEroCExxSwMBdM~#zR62v_;*n{0mmdB{MS8vfanXOn zH)2kxLEMDWXyNcOMGB*MmcX`6kvcK*2%DX^(Iby{F-tl|lufoI1d=R>=8q`AVD{lf zGBP#dc&Q~JG7pI{8m19#%8;@t$nr?s1Ge6d^n4BX$iHbTbyJ7N zj*)LE(xO7-7h_@Mmr%apyb@^9+y;8I@-{p&sX4hCk_*-=rf*QGi575BT^C>-RqBL@ zSw$R@cM_CKLc}h34MbIN+fekN9bi!`$Oku>kt7O59~7!c3vi*$P)kHv9>AhUf|e?5 z76gHEhbz*Ue8i7y#e$<0c0)Jf zf{x%M)Ekbtpffnxb7~IGfIt`U22_LfOPh~ndVs&cRIRYF^SI)R@i9XnfK&w^Q>69S z-s1~7$;T|aU+dD~9!1K9ZuGT`W7WO97ReH>X~QECYCso^QALUrRf@Pxt7FtX3d2^u z0j`eXpf;Z?ei%*%MKPGpqkh7e#JJWQG3qykWm7RBq@xvdMzcG8^k|^zF~nmOX0POx zexL?W9nI)v$YwRfAz|-DAuf11db`4Iv2rJhQBzs7M)c?paLZjUSB6;U=dMaeLBDDdHu8u=;6w}#O#04)xt_L+#yXdJ97*&_H@Y-SEq@6e8 z5qJWrRT{rT&MIbXS?U5fu>$sBhDJnam?9k{q(ZtwqZDal9&qaEWN!BG41ef=8N3LO zB{iZ-^lj)f5GE3?6#^S<@jZl1sI|}!5I>4IgHVSc{|UtR8`94x?2b6z5-qVu=#HlRh5x~Nj(lPDc_xgzycaO-eOdRa2SdLhh>9}v<;4QUuw8Kx}6n>6-@ zolsbS6|}Dx>EA1?iqiG`n6G{=0b}a4{NXTzcJ?5>Rm&efR$;>m5Eu1@Pgf-NW+itH z2bD$DBOp3)NG%t+cPmmju%UKUwS~hiG>ow6rJKN#Lc~Qsgny|>bHc#_MdXLS=tME7 z#WjYc8pC^)Ad0%|oRV~=7I zMQMH38GA}$HPml{sIfn5t|!xaE&n*IPvNm0;QY7{^b4_A^u)OFxFfO~)HG;Bj{{52 zqLH!?ws99LW>#0pn-$0h385I=<8D#dlo-V8M7eulShWC8l!)(8*v49<3yn7pi;eMA zUeGxXU41y5+X5|%%W?n~)klOwFc8&?Ma)nn6VU2n7ICFAR?#15iA*dq0RN$|s0uevtV6-G zWRZ@sVGU7CXYzUONK1NT5Wu2I*1HtOP)uhDPBWV8dU?Z0%eawsM3bn~`i3G|qquV< zgf6c70?elcZX}WL(+wviPOSlvP!;{uU!syotcXg80qr7vk-|djcs|gqLbf4Y0(`$B z-Cl!iVw6Xc3NJ=n&=C2&!m6psqI)7=S6CtONsp5qoGS98$&p_x(xHRgiE3zftv=w! z!=lG?;e?wMX%itV7U_3_fH=g70I+L9 zIpQ569)kE2i1+aPV01QdJzo@iPhr*u#6{;$fac!qgE-L%OcPFPPJ5pUZ7@&x5iZeU z-W+U6$gD*!(cGxX=v=cQK1-33n!)8ft(vICSi5#3T~rfwjl$-_h#7_Hrkm&Eq1u*0 zA4OrcmbaAG0vy@tMmiBA@w#%vMYf4h40}p=*CI2aylOPm3XygbXnuN)qhJ->0Ni>Aw!h?tlp^C7i+?_2J8vV*b#CK}hV$sel#f?4oQnYI?&lm%)LXnKYv{S`vDb~T8@i4AJC;LE- z_q%aV9)AvKJ+o_|V&V(Q362Pq;w1GD*=PTmG`XlWu^ z9T)jt0G=#v4F{j1kZp?wjvJ~lf07?DO5&i2|AtP)^sP?+aqwP_#Kr~`!|fcE^q9dL z!qN0X?nEqd9?FWQ$GNatM^wiZAE=l<%;DCt;7}#NLgeDFgoO}VuB5qPlu5;*! zOxOpdye$H~*}%K-hy;Iif3FP|U>~|wDiF2760d~fw4#ZfAfiQpzg8HwoaO^uhThWU zJ26C&>|H1=xSxpi&K43lq23a)=zDgjA^*jSR8fm~lZG~NxnepGhU=?{M3`K66T@3Y z`hDmC@J8>&#I1^H{3!(hF<=s(#mFu%XOighPiD|vLSuHA{`+-Vwg|E%ko195f=h6 z4a0myw|m%5hqrrL2-5d!&6*wqr+FLj3+*@k5{1W)w~WNXHDf#|cOt8h+v!z`6ugBO z5g3e-d<2G*igdvVUOV2Bo(XmgkJ7+1QWYsJ4yDB)ov{o~(jFA65$QK8(mGVE&(1S2 zsqbm$)(H@QGtZp>5h>(Fc+kk!b$61#!fvNdZ`Y6{MJUpHMTiU8NJ1xXb0UACNY6s2 zlfVi&Px=Eo)d%qkk$xSVFpw>&M8rYFUqH0nfnI?Dn^XZU^z{m`uSaAc%dUf4qhLar zfu~b|F^g}iLA*f3yWtVcgJ)od7N6-4&j{sj6!CaP`Vsl{cFhE{UTB8vu1%z8QLnC??6sTV_3W!F`dJ70rt0#f_R&K?El)OHkldW)TgC)8=CBxWt z_40gVBkiCsQj?28+@gm+b^tjJjl)x|Vjt1z(dp6)6@9 zOWG@n^#U8>I*U@^X}SobNm{C Date: Tue, 16 Jun 2020 10:42:44 +0200 Subject: [PATCH 17/28] WIP --- .../eigerDetectorServer/FebControl.c | 194 +++++++----------- .../eigerDetectorServer/FebControl.h | 19 -- 2 files changed, 71 insertions(+), 142 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 8961bd9fe..2f102b9b6 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -14,7 +14,6 @@ // GetDAQStatusRegister(512,current_mode_bits_from_fpga)) { -unsigned int Module_ndacs = 16; char Module_dac_names[16][10] = {"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", "VSvN", "Vtgstv", "Vcmp_ll", "Vcmp_lr", "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", @@ -22,15 +21,22 @@ char Module_dac_names[16][10] = {"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", struct Module module; -unsigned int - Feb_Control_staticBits; // program=1,m4=2,m8=4,test=8,rotest=16,cs_bar_left=32,cs_bar_right=64 -unsigned int - Feb_Control_acquireNReadoutMode; // safe or parallel, half or full speed -unsigned int - Feb_Control_triggerMode; // internal timer, external start, external window, - // signal polarity (external trigger and enable) -unsigned int Feb_Control_externalEnableMode; // external enabling engaged and - // it's polarity +const unsigned int Feb_Control_leftAddress = 0x100; +const unsigned int Feb_Control_rightAddress = 0x200; + +int Feb_Control_master = 0; +int Feb_Control_normal = 0; +int Feb_Control_activated = 1; + +int Feb_Control_hv_fd = -1; +const unsigned int Feb_Control_ndacs = 16; +int Feb_Control_dacs[Feb_Control_ndacs]; +unsigned int Feb_Control_idelay[4]; // ll,lr,rl,ll +int Feb_Control_counter_bit = 1; +unsigned int Feb_Control_staticBits; +unsigned int Feb_Control_acquireNReadoutMode; +unsigned int Feb_Control_triggerMode; +unsigned int Feb_Control_externalEnableMode; unsigned int Feb_Control_subFrameMode; unsigned int Feb_Control_softwareTrigger; @@ -40,68 +46,14 @@ int64_t Feb_Control_subframe_exposure_time_in_10nsec; int64_t Feb_Control_subframe_period_in_10nsec; double Feb_Control_exposure_period_in_sec; -int64_t Feb_Control_RateTable_Tau_in_nsec = -1; -int64_t Feb_Control_RateTable_Period_in_nsec = -1; - unsigned int Feb_Control_trimbit_size; unsigned int *Feb_Control_last_downloaded_trimbits; -int Feb_Control_counter_bit = 1; -int Feb_control_master = 0; -int Feb_control_normal = 0; - +int64_t Feb_Control_RateTable_Tau_in_nsec = -1; +int64_t Feb_Control_RateTable_Period_in_nsec = -1; unsigned int Feb_Control_rate_correction_table[1024]; double Feb_Control_rate_meas[16384]; - double ratemax = -1; -int Feb_Control_activated = 1; -int Feb_Control_hv_fd = -1; - -// module -void Module_Module(struct Module *mod) { - mod->left_address = 0x100; - mod->right_address = 0x200; - mod->high_voltage = -1; - mod->dac = malloc(Module_ndacs * sizeof(int)); - for (unsigned int i = 0; i < Module_ndacs; i++) - mod->dac[i] = 0; -} - -unsigned int Module_GetBaseAddress(struct Module *mod) { - return (mod->left_address & 0xff); -} - -unsigned int Module_GetLeftAddress(struct Module *mod) { - return mod->left_address; -} - -unsigned int Module_GetRightAddress(struct Module *mod) { - return mod->right_address; -} - -unsigned int Module_SetIDelay(struct Module *mod, unsigned int chip, - unsigned int value) { - // chip 0=ll,1=lr,0=rl,1=rr - return chip < 4 ? (mod->idelay[chip] = value) : 0; -} - -unsigned int Module_GetIDelay(struct Module *mod, unsigned int chip) { - return chip < 4 ? mod->idelay[chip] : 0; -} - -float Module_SetHighVoltage(struct Module *mod, float value) { - return Feb_control_master ? (mod->high_voltage = value) : -1; -} - -float Module_GetHighVoltage(struct Module *mod) { return mod->high_voltage; } - -int Module_SetDACValue(struct Module *mod, unsigned int i, int value) { - return (i < Module_ndacs) ? (mod->dac[i] = value) : -1; -} - -int Module_GetDACValue(struct Module *mod, unsigned int i) { - return (i < Module_ndacs) ? mod->dac[i] : -1; -} // setup void Feb_Control_activate(int activate) { Feb_Control_activated = activate; } @@ -116,11 +68,12 @@ void Feb_Control_FebControl() { } int Feb_Control_Init(int master, int normal, int module_num) { - Feb_control_master = master; - Feb_control_normal = normal; - Module_Module(&module); - Feb_Interface_SetAddress(Module_GetRightAddress(&module), - Module_GetLeftAddress(&module)); + Feb_Control_master = master; + Feb_Control_normal = normal; + for (unsigned int i = 0; i < Feb_Control_ndacs; ++i) { + Feb_Control_dacs[i] = 0; + } + Feb_Interface_SetAddress(Feb_Control_rightAddress, Feb_Control_leftAddress); if (Feb_Control_activated) { return Feb_Interface_SetByteOrder(); } @@ -190,18 +143,18 @@ int Feb_Control_CheckSetup(int master) { LOG(logDEBUG1, ("Checking Set up\n")); for (unsigned int j = 0; j < 4; j++) { - if (Module_GetIDelay(&module, j) < 0) { + if (Feb_Control_idelay[j] < 0) { LOG(logERROR, ("idelay chip %d not set.\n", j)); return 0; } } int value = 0; - if ((Feb_control_master) && (!Feb_Control_GetHighVoltage(&value))) { + if ((Feb_Control_master) && (!Feb_Control_GetHighVoltage(&value))) { LOG(logERROR, ("high voltage not set.\n")); return 0; } - for (unsigned int j = 0; j < Module_ndacs; j++) { - if (Module_GetDACValue(&module, j) < 0) { + for (unsigned int j = 0; j < Feb_Control_ndacs; j++) { + if (Feb_Control_dacs[j] < 0) { LOG(logERROR, ("\"%s\" dac is not set.\n", Module_dac_names[j])); return 0; } @@ -211,7 +164,7 @@ int Feb_Control_CheckSetup(int master) { } unsigned int Feb_Control_AddressToAll() { - return Module_GetLeftAddress(&module) | Module_GetRightAddress(&module); + return Feb_Control_leftAddress | Feb_Control_rightAddress; } int Feb_Control_SetCommandRegister(unsigned int cmd) { @@ -277,19 +230,17 @@ int Feb_Control_SetIDelays1( } if (chip_pos / 2 == 0) { // left fpga - if (Feb_Control_SendIDelays(Module_GetLeftAddress(&module), - chip_pos % 2 == 0, 0xffffffff, - ndelay_units)) { - Module_SetIDelay(&module, chip_pos, ndelay_units); + if (Feb_Control_SendIDelays(Feb_Control_leftAddress, chip_pos % 2 == 0, + 0xffffffff, ndelay_units)) { + Feb_Control_idelay[chip_pos] = ndelay_units; } else { LOG(logERROR, ("could not set idelay (left).\n")); return 0; } } else { - if (Feb_Control_SendIDelays(Module_GetRightAddress(&module), - chip_pos % 2 == 0, 0xffffffff, - ndelay_units)) { - Module_SetIDelay(&module, chip_pos, ndelay_units); + if (Feb_Control_SendIDelays(Feb_Control_rightAddress, chip_pos % 2 == 0, + 0xffffffff, ndelay_units)) { + Feb_Control_idelay[chip_pos] = ndelay_units; } else { LOG(logERROR, ("could not set idelay (right).\n")); return 0; @@ -348,7 +299,7 @@ int Feb_Control_SetHighVoltage(int value) { */ const float vmin = 0; float vmax = 200; - if (Feb_control_normal) + if (Feb_Control_normal) vmax = 300; const float vlimit = 200; const unsigned int ntotalsteps = 256; @@ -384,7 +335,7 @@ int Feb_Control_GetHighVoltage(int *value) { */ const float vmin = 0; float vmax = 200; - if (Feb_control_normal) + if (Feb_Control_normal) vmax = 300; const float vlimit = 200; const unsigned int ntotalsteps = 256; @@ -398,7 +349,7 @@ int Feb_Control_GetHighVoltage(int *value) { int Feb_Control_SendHighVoltage(int dacvalue) { // normal - if (Feb_control_normal) { + if (Feb_Control_normal) { // open file FILE *fd = fopen(NORMAL_HIGHVOLTAGE_OUTPUTPORT, "w"); if (fd == NULL) { @@ -461,7 +412,7 @@ int Feb_Control_SendHighVoltage(int dacvalue) { int Feb_Control_ReceiveHighVoltage(unsigned int *value) { // normal - if (Feb_control_normal) { + if (Feb_Control_normal) { // open file FILE *fd = fopen(NORMAL_HIGHVOLTAGE_INPUTPORT, "r"); if (fd == NULL) { @@ -580,6 +531,7 @@ int Feb_Control_DecodeDACString(char *dac_str, unsigned int *dac_ch) { int Feb_Control_SetDAC(char *dac_str, int value, int is_a_voltage_mv) { unsigned int dac_ch; + // test dac_ch validity if (!Feb_Control_DecodeDACString(dac_str, &dac_ch)) return 0; @@ -594,26 +546,27 @@ int Feb_Control_SetDAC(char *dac_str, int value, int is_a_voltage_mv) { LOG(logERROR, ("SetDac bad value, %d. The range is 0 to 4095.\n", v)); return 0; } - if (!Feb_Control_SendDACValue(Module_GetRightAddress(&module), dac_ch, &v)) + if (!Feb_Control_SendDACValue(Feb_Control_rightAddress, dac_ch, &v)) return 0; - Module_SetDACValue(&module, dac_ch, v); + Feb_Control_dacs[dac_ch] = v; return 1; } int Feb_Control_GetDAC(char *s, int *ret_value, int voltage_mv) { unsigned int dac_ch; + // test dac_ch validity if (!Feb_Control_DecodeDACString(s, &dac_ch)) return 0; - *ret_value = Module_GetDACValue(&module, dac_ch); + *ret_value = Feb_Control_dacs[dac_ch]; if (voltage_mv) *ret_value = Feb_Control_DACToVoltage(*ret_value, 4096, 0, 2048); return 1; } int Feb_Control_GetDACName(unsigned int dac_num, char *s) { - if (dac_num >= Module_ndacs) { + if (dac_num >= Feb_Control_ndacs) { LOG(logERROR, ("GetDACName index out of range, %d invalid.\n", dac_num)); return 0; @@ -623,7 +576,7 @@ int Feb_Control_GetDACName(unsigned int dac_num, char *s) { } int Feb_Control_GetDACNumber(char *s, unsigned int *n) { - for (unsigned int i = 0; i < Module_ndacs; i++) { + for (unsigned int i = 0; i < Feb_Control_ndacs; i++) { if (!strcmp(Module_dac_names[i], s)) { *n = i; return 1; @@ -787,12 +740,12 @@ int Feb_Control_SetTrimbits(unsigned int *trimbits, int top) { } // end row loop if (Feb_Control_activated) { - if (!Feb_Interface_WriteMemoryInLoops( - Module_GetLeftAddress(&module), 0, 0, 1024, - trimbits_to_load_l) || - !Feb_Interface_WriteMemoryInLoops( - Module_GetRightAddress(&module), 0, 0, 1024, - trimbits_to_load_r) || + if (!Feb_Interface_WriteMemoryInLoops(Feb_Control_leftAddress, + 0, 0, 1024, + trimbits_to_load_l) || + !Feb_Interface_WriteMemoryInLoops(Feb_Control_rightAddress, + 0, 0, 1024, + trimbits_to_load_r) || (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { LOG(logERROR, (" some errror in setting trimbits!\n")); @@ -826,13 +779,13 @@ int Feb_Control_AcquisitionInProgress() { if (!Feb_Control_activated) return STATUS_IDLE; - if (!(Feb_Control_GetDAQStatusRegister(Module_GetRightAddress(&module), + if (!(Feb_Control_GetDAQStatusRegister(Feb_Control_rightAddress, &status_reg_r))) { LOG(logERROR, ("Error: Trouble reading Status register (right)" "address\n")); return STATUS_ERROR; } - if (!(Feb_Control_GetDAQStatusRegister(Module_GetLeftAddress(&module), + if (!(Feb_Control_GetDAQStatusRegister(Feb_Control_leftAddress, &status_reg_l))) { LOG(logERROR, ("Error: Trouble reading Status register (left)\n")); return STATUS_ERROR; @@ -851,12 +804,12 @@ int Feb_Control_AcquisitionStartedBit() { if (!Feb_Control_activated) return 1; - if (!(Feb_Control_GetDAQStatusRegister(Module_GetRightAddress(&module), + if (!(Feb_Control_GetDAQStatusRegister(Feb_Control_rightAddress, &status_reg_r))) { LOG(logERROR, ("Error: Trouble reading Status register (right)\n")); return -1; } - if (!(Feb_Control_GetDAQStatusRegister(Module_GetLeftAddress(&module), + if (!(Feb_Control_GetDAQStatusRegister(Feb_Control_leftAddress, &status_reg_l))) { LOG(logERROR, ("Error: Trouble reading Status register (left)\n")); return -1; @@ -1371,8 +1324,7 @@ int Feb_Control_SetInterruptSubframe(int val) { uint32_t offset = DAQ_REG_HRDWRE; uint32_t regVal = 0; char side[2][10] = {"right", "left"}; - unsigned int addr[2] = {Module_GetRightAddress(&module), - Module_GetLeftAddress(&module)}; + unsigned int addr[2] = {Feb_Control_rightAddress, Feb_Control_leftAddress}; for (int iloop = 0; iloop < 2; ++iloop) { // get previous value to keep it if (!Feb_Interface_ReadRegister(addr[iloop], offset, ®Val)) { @@ -1399,8 +1351,7 @@ int Feb_Control_GetInterruptSubframe() { uint32_t regVal = 0; char side[2][10] = {"right", "left"}; - unsigned int addr[2] = {Module_GetRightAddress(&module), - Module_GetLeftAddress(&module)}; + unsigned int addr[2] = {Feb_Control_rightAddress, Feb_Control_leftAddress}; uint32_t value[2] = {0, 0}; for (int iloop = 0; iloop < 2; ++iloop) { if (!Feb_Interface_ReadRegister(addr[iloop], offset, ®Val)) { @@ -1425,10 +1376,10 @@ int Feb_Control_SetTop(enum TOPINDEX ind, int left, int right) { uint32_t offset = DAQ_REG_HRDWRE; unsigned int addr[2] = {0, 0}; if (left) { - addr[0] = Module_GetLeftAddress(&module); + addr[0] = Feb_Control_leftAddress; } if (right) { - addr[1] = Module_GetRightAddress(&module); + addr[1] = Feb_Control_rightAddress; } char *top_names[] = {TOP_NAMES}; for (int i = 0; i < 2; ++i) { @@ -1471,12 +1422,11 @@ int Feb_Control_SetTop(enum TOPINDEX ind, int left, int right) { return 1; } -void Feb_Control_SetMasterVariable(int val) { Feb_control_master = val; } +void Feb_Control_SetMasterVariable(int val) { Feb_Control_master = val; } int Feb_Control_SetMaster(enum MASTERINDEX ind) { uint32_t offset = DAQ_REG_HRDWRE; - unsigned int addr[2] = {Module_GetLeftAddress(&module), - Module_GetRightAddress(&module)}; + unsigned int addr[2] = {Feb_Control_leftAddress, Feb_Control_rightAddress}; char *master_names[] = {MASTER_NAMES}; for (int i = 0; i < 2; ++i) { uint32_t value = 0; @@ -1544,8 +1494,7 @@ int Feb_Control_GetReadNLines() { int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { uint32_t actualOffset = offset; char side[2][10] = {"right", "left"}; - unsigned int addr[2] = {Module_GetRightAddress(&module), - Module_GetLeftAddress(&module)}; + unsigned int addr[2] = {Feb_Control_rightAddress, Feb_Control_leftAddress}; int run[2] = {0, 0}; // both registers @@ -1583,8 +1532,7 @@ int Feb_Control_WriteRegister(uint32_t offset, uint32_t data) { int Feb_Control_ReadRegister(uint32_t offset, uint32_t *retval) { uint32_t actualOffset = offset; char side[2][10] = {"right", "left"}; - unsigned int addr[2] = {Module_GetRightAddress(&module), - Module_GetLeftAddress(&module)}; + unsigned int addr[2] = {Feb_Control_rightAddress, Feb_Control_leftAddress}; uint32_t value[2] = {0, 0}; int run[2] = {0, 0}; // both registers @@ -1950,10 +1898,10 @@ int Feb_Control_SetRateCorrectionTable(unsigned int *table) { if (Feb_Control_activated) { if (!Feb_Interface_WriteMemoryInLoops( - Module_GetLeftAddress(&module), 1, 0, 1024, + Feb_Control_leftAddress, 1, 0, 1024, Feb_Control_rate_correction_table) || !Feb_Interface_WriteMemoryInLoops( - Module_GetRightAddress(&module), 1, 0, 1024, + Feb_Control_rightAddress, 1, 0, 1024, Feb_Control_rate_correction_table) || (Feb_Control_StartDAQOnlyNWaitForFinish(5000) != STATUS_IDLE)) { LOG(logERROR, ("could not write to memory (top) " @@ -2005,7 +1953,7 @@ int Feb_Control_PrintCorrectedValues() { // A1) and then A1/65536/0.00198421639-273.15 int Feb_Control_GetLeftFPGATemp() { unsigned int temperature = 0; - Feb_Interface_ReadRegister(Module_GetLeftAddress(&module), FEB_REG_STATUS, + Feb_Interface_ReadRegister(Feb_Control_leftAddress, FEB_REG_STATUS, &temperature); temperature = temperature >> 16; @@ -2018,7 +1966,7 @@ int Feb_Control_GetLeftFPGATemp() { int Feb_Control_GetRightFPGATemp() { unsigned int temperature = 0; - Feb_Interface_ReadRegister(Module_GetRightAddress(&module), FEB_REG_STATUS, + Feb_Interface_ReadRegister(Feb_Control_rightAddress, FEB_REG_STATUS, &temperature); temperature = temperature >> 16; temperature = @@ -2030,14 +1978,14 @@ int Feb_Control_GetRightFPGATemp() { int64_t Feb_Control_GetMeasuredPeriod() { unsigned int value = 0; - Feb_Interface_ReadRegister(Module_GetLeftAddress(&module), MEAS_PERIOD_REG, + Feb_Interface_ReadRegister(Feb_Control_leftAddress, MEAS_PERIOD_REG, &value); return (int64_t)value * 10; } int64_t Feb_Control_GetSubMeasuredPeriod() { unsigned int value = 0; - Feb_Interface_ReadRegister(Module_GetLeftAddress(&module), - MEAS_SUBPERIOD_REG, &value); + Feb_Interface_ReadRegister(Feb_Control_leftAddress, MEAS_SUBPERIOD_REG, + &value); return (int64_t)value * 10; } diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index bf2eae136..1298e33b2 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -3,25 +3,6 @@ #include "slsDetectorServer_defs.h" #include -struct Module { - unsigned int left_address; - unsigned int right_address; - unsigned int idelay[4]; // ll,lr,rl,ll - float high_voltage; - int *dac; -}; -// module struct -void Module_Module(struct Module *mod); -unsigned int Module_GetBaseAddress(struct Module *mod); -unsigned int Module_GetLeftAddress(struct Module *mod); -unsigned int Module_GetRightAddress(struct Module *mod); -unsigned int Module_SetIDelay(struct Module *mod, unsigned int chip, - unsigned int value); -unsigned int Module_GetIDelay(struct Module *mod, unsigned int chip); -float Module_SetHighVoltage(struct Module *mod, float value); -float Module_GetHighVoltage(struct Module *mod); -int Module_SetDACValue(struct Module *mod, unsigned int i, int value); -int Module_GetDACValue(struct Module *mod, unsigned int i); // setup void Feb_Control_activate(int activate); void Feb_Control_FebControl(); From 0289f22a0d705b3a03ac452333ac29ea8d140a24 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 16 Jun 2020 10:44:41 +0200 Subject: [PATCH 18/28] WIP --- slsDetectorServers/eigerDetectorServer/FebControl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 2f102b9b6..5deb35338 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -29,7 +29,7 @@ int Feb_Control_normal = 0; int Feb_Control_activated = 1; int Feb_Control_hv_fd = -1; -const unsigned int Feb_Control_ndacs = 16; +const static unsigned int Feb_Control_ndacs = 16; int Feb_Control_dacs[Feb_Control_ndacs]; unsigned int Feb_Control_idelay[4]; // ll,lr,rl,ll int Feb_Control_counter_bit = 1; From 82a6383466e836e99eb422d04f6099421a60ed16 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 16 Jun 2020 10:47:23 +0200 Subject: [PATCH 19/28] WIP --- slsDetectorServers/eigerDetectorServer/FebControl.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 5deb35338..0771c422d 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -29,8 +29,7 @@ int Feb_Control_normal = 0; int Feb_Control_activated = 1; int Feb_Control_hv_fd = -1; -const static unsigned int Feb_Control_ndacs = 16; -int Feb_Control_dacs[Feb_Control_ndacs]; +int Feb_Control_dacs[NDAC]; unsigned int Feb_Control_idelay[4]; // ll,lr,rl,ll int Feb_Control_counter_bit = 1; unsigned int Feb_Control_staticBits; @@ -70,7 +69,7 @@ void Feb_Control_FebControl() { int Feb_Control_Init(int master, int normal, int module_num) { Feb_Control_master = master; Feb_Control_normal = normal; - for (unsigned int i = 0; i < Feb_Control_ndacs; ++i) { + for (unsigned int i = 0; i < NDAC; ++i) { Feb_Control_dacs[i] = 0; } Feb_Interface_SetAddress(Feb_Control_rightAddress, Feb_Control_leftAddress); @@ -153,7 +152,7 @@ int Feb_Control_CheckSetup(int master) { LOG(logERROR, ("high voltage not set.\n")); return 0; } - for (unsigned int j = 0; j < Feb_Control_ndacs; j++) { + for (unsigned int j = 0; j < NDAC; j++) { if (Feb_Control_dacs[j] < 0) { LOG(logERROR, ("\"%s\" dac is not set.\n", Module_dac_names[j])); return 0; @@ -566,7 +565,7 @@ int Feb_Control_GetDAC(char *s, int *ret_value, int voltage_mv) { } int Feb_Control_GetDACName(unsigned int dac_num, char *s) { - if (dac_num >= Feb_Control_ndacs) { + if (dac_num >= NDAC) { LOG(logERROR, ("GetDACName index out of range, %d invalid.\n", dac_num)); return 0; @@ -576,7 +575,7 @@ int Feb_Control_GetDACName(unsigned int dac_num, char *s) { } int Feb_Control_GetDACNumber(char *s, unsigned int *n) { - for (unsigned int i = 0; i < Feb_Control_ndacs; i++) { + for (unsigned int i = 0; i < NDAC; i++) { if (!strcmp(Module_dac_names[i], s)) { *n = i; return 1; From c0e8e44b4177357f6630fa8dc8134d54661ced72 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 16 Jun 2020 10:47:53 +0200 Subject: [PATCH 20/28] WIP --- slsDetectorServers/eigerDetectorServer/FebControl.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 0771c422d..f8211b655 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -19,8 +19,6 @@ char Module_dac_names[16][10] = {"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", "Vcmp_rr", "Vcp", "Vcn", "Vishaper"}; -struct Module module; - const unsigned int Feb_Control_leftAddress = 0x100; const unsigned int Feb_Control_rightAddress = 0x200; From efc247f46f6d9b9309c6c5eb1a05618a29c60e0a Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 16 Jun 2020 12:32:28 +0200 Subject: [PATCH 21/28] WIP --- slsDetectorGui/src/qDacWidget.cpp | 4 +- .../eigerDetectorServer/FebControl.c | 77 +------------------ .../eigerDetectorServer/FebControl.h | 6 +- .../slsDetectorFunctionList.c | 24 +++--- .../slsDetectorServer_defs.h | 24 +++--- 5 files changed, 35 insertions(+), 100 deletions(-) diff --git a/slsDetectorGui/src/qDacWidget.cpp b/slsDetectorGui/src/qDacWidget.cpp index 284f4f0e2..045bf5e75 100644 --- a/slsDetectorGui/src/qDacWidget.cpp +++ b/slsDetectorGui/src/qDacWidget.cpp @@ -45,7 +45,9 @@ void qDacWidget::GetDac() { spinDac->setValue(retval); // mv retval = det->getDAC(index, 1, {detectorIndex}).squash(-1); - lblDacmV->setText(QString("%1mV").arg(retval - 10)); + // -6 is the minimum amt of space it occupies, if more needed, its + // padded with ' ', negative value for left aligned text + lblDacmV->setText(QString("%1mV").arg(retval, -6)); } CATCH_DISPLAY(std::string("Could not get dac ") + std::to_string(index), "qDacWidget::GetDac") diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index f8211b655..4677cd1d4 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -12,8 +12,6 @@ #include #include -// GetDAQStatusRegister(512,current_mode_bits_from_fpga)) { - char Module_dac_names[16][10] = {"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", "VSvN", "Vtgstv", "Vcmp_ll", "Vcmp_lr", "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", @@ -27,7 +25,6 @@ int Feb_Control_normal = 0; int Feb_Control_activated = 1; int Feb_Control_hv_fd = -1; -int Feb_Control_dacs[NDAC]; unsigned int Feb_Control_idelay[4]; // ll,lr,rl,ll int Feb_Control_counter_bit = 1; unsigned int Feb_Control_staticBits; @@ -67,9 +64,6 @@ void Feb_Control_FebControl() { int Feb_Control_Init(int master, int normal, int module_num) { Feb_Control_master = master; Feb_Control_normal = normal; - for (unsigned int i = 0; i < NDAC; ++i) { - Feb_Control_dacs[i] = 0; - } Feb_Interface_SetAddress(Feb_Control_rightAddress, Feb_Control_leftAddress); if (Feb_Control_activated) { return Feb_Interface_SetByteOrder(); @@ -150,12 +144,6 @@ int Feb_Control_CheckSetup(int master) { LOG(logERROR, ("high voltage not set.\n")); return 0; } - for (unsigned int j = 0; j < NDAC; j++) { - if (Feb_Control_dacs[j] < 0) { - LOG(logERROR, ("\"%s\" dac is not set.\n", Module_dac_names[j])); - return 0; - } - } LOG(logDEBUG1, ("Done Checking Set up\n")); return 1; } @@ -517,69 +505,8 @@ float Feb_Control_DACToVoltage(unsigned int digital, unsigned int nsteps, return vmin + (vmax - vmin) * digital / (nsteps - 1); } -int Feb_Control_DecodeDACString(char *dac_str, unsigned int *dac_ch) { - *dac_ch = 0; - if (!Feb_Control_GetDACNumber(dac_str, dac_ch)) { - LOG(logERROR, ("invalid dac_name: %s \n", dac_str)); - return 0; - } - return 1; -} - -int Feb_Control_SetDAC(char *dac_str, int value, int is_a_voltage_mv) { - unsigned int dac_ch; - // test dac_ch validity - if (!Feb_Control_DecodeDACString(dac_str, &dac_ch)) - return 0; - - unsigned int v = value; - if (is_a_voltage_mv && - !Feb_Control_VoltageToDAC(value, &v, 4096, 0, 2048)) { - LOG(logERROR, - ("SetDac bad value, %d. The range is 0 to 2048 mV.\n", value)); - return 0; - } - if (v < 0 || v > 4095) { - LOG(logERROR, ("SetDac bad value, %d. The range is 0 to 4095.\n", v)); - return 0; - } - if (!Feb_Control_SendDACValue(Feb_Control_rightAddress, dac_ch, &v)) - return 0; - - Feb_Control_dacs[dac_ch] = v; - return 1; -} - -int Feb_Control_GetDAC(char *s, int *ret_value, int voltage_mv) { - unsigned int dac_ch; - // test dac_ch validity - if (!Feb_Control_DecodeDACString(s, &dac_ch)) - return 0; - - *ret_value = Feb_Control_dacs[dac_ch]; - if (voltage_mv) - *ret_value = Feb_Control_DACToVoltage(*ret_value, 4096, 0, 2048); - return 1; -} - -int Feb_Control_GetDACName(unsigned int dac_num, char *s) { - if (dac_num >= NDAC) { - LOG(logERROR, - ("GetDACName index out of range, %d invalid.\n", dac_num)); - return 0; - } - strcpy(s, Module_dac_names[dac_num]); - return 1; -} - -int Feb_Control_GetDACNumber(char *s, unsigned int *n) { - for (unsigned int i = 0; i < NDAC; i++) { - if (!strcmp(Module_dac_names[i], s)) { - *n = i; - return 1; - } - } - return 0; +int Feb_Control_SetDAC(unsigned int dac_ch, int value) { + return Feb_Control_SendDACValue(Feb_Control_rightAddress, dac_ch, &value); } int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index 1298e33b2..158ae9155 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -31,11 +31,7 @@ int Feb_Control_VoltageToDAC(float value, unsigned int *digital, unsigned int nsteps, float vmin, float vmax); float Feb_Control_DACToVoltage(unsigned int digital, unsigned int nsteps, float vmin, float vmax); -int Feb_Control_DecodeDACString(char *dac_str, unsigned int *dac_ch); -int Feb_Control_SetDAC(char *s, int value, int is_a_voltage_mv); -int Feb_Control_GetDAC(char *s, int *ret_value, int voltage_mv); -int Feb_Control_GetDACName(unsigned int dac_num, char *s); -int Feb_Control_GetDACNumber(char *s, unsigned int *n); +int Feb_Control_SetDAC(unsigned int dac_ch, int value, ); int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, unsigned int *value); diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index e33355c24..bac96023c 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -33,10 +33,6 @@ int initError = OK; int initCheckDone = 0; char initErrorMessage[MAX_STR_LENGTH]; -const char *dac_names[16] = {"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", - "VSvN", "Vtgstv", "Vcmp_ll", "Vcmp_lr", - "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", - "Vcmp_rr", "Vcp", "Vcn", "Vishaper"}; int default_tau_from_file = -1; enum detectorSettings thisSettings; sls_detector_module *detectorModules = NULL; @@ -1205,6 +1201,10 @@ void setDAC(enum DACINDEX ind, int val, int mV) { return; } + char *dac_names[] = {DAC_NAMES}; + LOG(logINFO, ("Setting dac[%d - %s]: %d %s \n", (int)ind, dac_names[ind], + val, (mV ? "mV" : "dac units"))); + #ifdef VIRTUAL int dacval = 0; if (!mV) { @@ -1216,11 +1216,17 @@ void setDAC(enum DACINDEX ind, int val, int mV) { (detectorModules)->dacs[ind] = dacval; } #else - char iname[10]; - strcpy(iname, dac_names[(int)ind]); - if (Feb_Control_SetDAC(iname, val, mV)) { - int dacval = 0; - Feb_Control_GetDAC(iname, &dacval, 0); + int dacval = val; + if (mV) { + // convert to dac units + if (ConvertToDifferentRange(DAC_MIN_MV, DAC_MAX_MV, LTC2620_MIN_VAL, + LTC2620_MAX_VAL, val, &dacval) == FAIL) { + LOG(logERRROR, + ("Could not convert %d mV for dac to dac units\n", val)); + return; + } + } + if (Feb_Control_SetDAC(ind, dacval)) { (detectorModules)->dacs[ind] = dacval; } #endif diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h index 7d615d69b..e3c94ad74 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h @@ -30,6 +30,10 @@ enum DACINDEX { E_VISHAPER, E_VTHRESHOLD }; +#define DAC_NAMES +"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", "VSvN", "Vtgstv", "Vcmp_ll", "Vcmp_lr", + "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", "Vcmp_rr", "Vcp", "Vcn", + "Vishaper" #define DEFAULT_DAC_VALS \ { \ 0, /* VSvP */ \ @@ -49,16 +53,16 @@ enum DACINDEX { 2000, /* Vcn */ \ 1550 /* Vishaper */ \ }; -enum ADCINDEX { - TEMP_FPGAEXT, - TEMP_10GE, - TEMP_DCDC, - TEMP_SODL, - TEMP_SODR, - TEMP_FPGA, - TEMP_FPGAFEBL, - TEMP_FPGAFEBR -}; + enum ADCINDEX { + TEMP_FPGAEXT, + TEMP_10GE, + TEMP_DCDC, + TEMP_SODL, + TEMP_SODR, + TEMP_FPGA, + TEMP_FPGAFEBL, + TEMP_FPGAFEBR + }; enum NETWORKINDEX { TXN_LEFT, TXN_RIGHT, TXN_FRAME, FLOWCTRL_10G }; enum ROINDEX { E_PARALLEL, E_NON_PARALLEL }; enum CLKINDEX { RUN_CLK, NUM_CLOCKS }; From 9a8097592965ecc22b2d7b73fe806152b7167789 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 16 Jun 2020 12:41:39 +0200 Subject: [PATCH 22/28] WIP --- .../slsDetectorServer_defs.h | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h index e3c94ad74..a5921fe44 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorServer_defs.h @@ -30,10 +30,10 @@ enum DACINDEX { E_VISHAPER, E_VTHRESHOLD }; -#define DAC_NAMES -"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", "VSvN", "Vtgstv", "Vcmp_ll", "Vcmp_lr", - "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", "Vcmp_rr", "Vcp", "Vcn", - "Vishaper" +#define DAC_NAMES \ + "VSvP", "Vtrim", "Vrpreamp", "Vrshaper", "VSvN", "Vtgstv", "Vcmp_ll", \ + "Vcmp_lr", "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", "Vcmp_rr", "Vcp", \ + "Vcn", "Vishaper" #define DEFAULT_DAC_VALS \ { \ 0, /* VSvP */ \ @@ -53,16 +53,16 @@ enum DACINDEX { 2000, /* Vcn */ \ 1550 /* Vishaper */ \ }; - enum ADCINDEX { - TEMP_FPGAEXT, - TEMP_10GE, - TEMP_DCDC, - TEMP_SODL, - TEMP_SODR, - TEMP_FPGA, - TEMP_FPGAFEBL, - TEMP_FPGAFEBR - }; +enum ADCINDEX { + TEMP_FPGAEXT, + TEMP_10GE, + TEMP_DCDC, + TEMP_SODL, + TEMP_SODR, + TEMP_FPGA, + TEMP_FPGAFEBL, + TEMP_FPGAFEBR +}; enum NETWORKINDEX { TXN_LEFT, TXN_RIGHT, TXN_FRAME, FLOWCTRL_10G }; enum ROINDEX { E_PARALLEL, E_NON_PARALLEL }; enum CLKINDEX { RUN_CLK, NUM_CLOCKS }; From f28b41b1305f79abd0c812ffa79281b6c5ba6cc2 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 16 Jun 2020 12:42:19 +0200 Subject: [PATCH 23/28] WIP --- slsDetectorServers/eigerDetectorServer/FebControl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index 158ae9155..2f6cf53ae 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -31,7 +31,7 @@ int Feb_Control_VoltageToDAC(float value, unsigned int *digital, unsigned int nsteps, float vmin, float vmax); float Feb_Control_DACToVoltage(unsigned int digital, unsigned int nsteps, float vmin, float vmax); -int Feb_Control_SetDAC(unsigned int dac_ch, int value, ); +int Feb_Control_SetDAC(unsigned int dac_ch, int value); int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, unsigned int *value); From 19bd39eece7fdad71b19b0eb26047a7e421a0f33 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 16 Jun 2020 12:47:06 +0200 Subject: [PATCH 24/28] WIP --- .../eigerDetectorServer/FebControl.c | 26 +++++-------------- .../eigerDetectorServer/FebControl.h | 4 +-- 2 files changed, 7 insertions(+), 23 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index 4677cd1d4..e4bea9475 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -12,11 +12,6 @@ #include #include -char Module_dac_names[16][10] = {"VSvP", "Vtrim", "Vrpreamp", "Vrshaper", - "VSvN", "Vtgstv", "Vcmp_ll", "Vcmp_lr", - "Vcal", "Vcmp_rl", "rxb_rb", "rxb_lb", - "Vcmp_rr", "Vcp", "Vcn", "Vishaper"}; - const unsigned int Feb_Control_leftAddress = 0x100; const unsigned int Feb_Control_rightAddress = 0x200; @@ -505,23 +500,18 @@ float Feb_Control_DACToVoltage(unsigned int digital, unsigned int nsteps, return vmin + (vmax - vmin) * digital / (nsteps - 1); } -int Feb_Control_SetDAC(unsigned int dac_ch, int value) { - return Feb_Control_SendDACValue(Feb_Control_rightAddress, dac_ch, &value); -} - -int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, - unsigned int *value) { - +int Feb_Control_SetDAC(unsigned int ch, int value) { + unsigned int dst_num = Feb_Control_rightAddress; if (ch < 0 || ch > 15) { LOG(logERROR, ("invalid ch for SetDAC.\n")); return 0; } - *value &= 0xfff; + value &= 0xfff; unsigned int dac_ic = (ch < 8) ? 1 : 2; unsigned int dac_ch = ch % 8; unsigned int r = - dac_ic << 30 | 3 << 16 | dac_ch << 12 | *value; // 3 write and power up + dac_ic << 30 | 3 << 16 | dac_ch << 12 | value; // 3 write and power up if (Feb_Control_activated) { if (!Feb_Interface_WriteRegister(dst_num, 0, r, 1, 0)) { @@ -530,12 +520,8 @@ int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, } } - float voltage = Feb_Control_DACToVoltage(*value, 4096, 0, 2048); - - LOG(logINFO, - ("%s set to %d (%.2fmV)\n", Module_dac_names[ch], *value, voltage)); - LOG(logDEBUG1, ("Dac number %d (%s) of dst %d set to %d (%f mV)\n", ch, - Module_dac_names[ch], dst_num, *value, voltage)); + float voltage = Feb_Control_DACToVoltage(value, 4096, 0, 2048); + LOG(logINFO, ("\tset to %d (%.2fmV)\n", value, voltage)); return 1; } diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.h b/slsDetectorServers/eigerDetectorServer/FebControl.h index 2f6cf53ae..86056a2aa 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.h +++ b/slsDetectorServers/eigerDetectorServer/FebControl.h @@ -31,9 +31,7 @@ int Feb_Control_VoltageToDAC(float value, unsigned int *digital, unsigned int nsteps, float vmin, float vmax); float Feb_Control_DACToVoltage(unsigned int digital, unsigned int nsteps, float vmin, float vmax); -int Feb_Control_SetDAC(unsigned int dac_ch, int value); -int Feb_Control_SendDACValue(unsigned int dst_num, unsigned int ch, - unsigned int *value); +int Feb_Control_SetDAC(unsigned int ch, int value); // trimbits int Feb_Control_SetTrimbits(unsigned int *trimbits, int top); From 889e92647926184530f059dd39b605eeedf63cce Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 16 Jun 2020 12:47:40 +0200 Subject: [PATCH 25/28] WIP --- .../eigerDetectorServer/slsDetectorFunctionList.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index bac96023c..30b357b6e 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -1221,7 +1221,7 @@ void setDAC(enum DACINDEX ind, int val, int mV) { // convert to dac units if (ConvertToDifferentRange(DAC_MIN_MV, DAC_MAX_MV, LTC2620_MIN_VAL, LTC2620_MAX_VAL, val, &dacval) == FAIL) { - LOG(logERRROR, + LOG(logERROR, ("Could not convert %d mV for dac to dac units\n", val)); return; } From ffb1a59df08f27dbb9312a88de093b08d1956c91 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 16 Jun 2020 12:53:34 +0200 Subject: [PATCH 26/28] binary --- .../bin/eigerDetectorServer_developer | Bin 353642 -> 353336 bytes slsSupportLib/include/versionAPI.h | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 66601d6efad1f81a0da7730ba3f4efb7b8c4860a..a303ef062c89c6ab3c59813fe2b8a1eba85153f6 100755 GIT binary patch delta 86786 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 delta 89001 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

r9Rz(XsPnG6KXTU0vwlAR&bMtx!0wvnBIY0Drx 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�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 F{{!->WYGWs diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 47dac799a..9de40495e 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -9,4 +9,4 @@ #define APIMYTHEN3 0x200610 #define APIMOENCH 0x200610 #define APIGOTTHARD2 0x200610 -#define APIEIGER 0x200615 +#define APIEIGER 0x200616 From e80bc905d609338a16de771b97aab25587ac85d8 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 17 Jun 2020 09:10:48 +0200 Subject: [PATCH 27/28] minor print fix --- slsDetectorServers/eigerDetectorServer/FebControl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/eigerDetectorServer/FebControl.c b/slsDetectorServers/eigerDetectorServer/FebControl.c index e4bea9475..2f563538c 100644 --- a/slsDetectorServers/eigerDetectorServer/FebControl.c +++ b/slsDetectorServers/eigerDetectorServer/FebControl.c @@ -1275,7 +1275,7 @@ int Feb_Control_GetInterruptSubframe() { // inconsistent if (value[0] != value[1]) { LOG(logERROR, ("Inconsistent values of interrupt subframe betweeen " - "left %d and right %d\n", + "right %d and left %d\n", value[0], value[1])); return -1; } From b5b50a2061d39b5c20b26c1ee452130ab4d30d06 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 17 Jun 2020 09:11:44 +0200 Subject: [PATCH 28/28] binary in --- .../bin/eigerDetectorServer_developer | Bin 353336 -> 353336 bytes slsSupportLib/include/versionAPI.h | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index a303ef062c89c6ab3c59813fe2b8a1eba85153f6..075f965adc67f90e8e7d3bb57dd1abb0377df70e 100755 GIT binary patch delta 69 zcmdmSLUhLo(GA*SjN+4Z#Pk`(n`6Yb$A~drFJ%;OH|b&AZqmbadyYU+W_m`6f@+FF YVqS_uPHI}aye2acvuu~wWR