diff --git a/site_ansto/hardsup/Monitor/cntr.c b/site_ansto/hardsup/Monitor/cntr.c index 0e54e308..8e2d8e1d 100644 --- a/site_ansto/hardsup/Monitor/cntr.c +++ b/site_ansto/hardsup/Monitor/cntr.c @@ -269,6 +269,8 @@ int cntr_start(COUNTER *cp) int error = 0; char errBuff[2048]={'\0'}; struct timeval now; + int value; + PARAMETERS* pp = &cp->params; /* start the counter object */ gettimeofday(&now, NULL); cp->current_time = now; @@ -283,6 +285,14 @@ int cntr_start(COUNTER *cp) cp->previous_time = cp->current_time; HCTR_TEST(hctr_read(cp->private_data, &cp->count64)); make_report(cp); + if (pp->output_line == 1) + value = 1; + else if (pp->output_line == 2) + value = 0; + else + value = -1; + dprintf(0, "Setting output line to %d\n", value); + HCTR_TEST(hctr_outp(cp->private_data, value)); return error; Error: cntr_errmsg(errBuff, sizeof(errBuff)); @@ -292,9 +302,25 @@ Error: int cntr_stop(COUNTER *cp) { + int error = 0; + char errBuff[2048]={'\0'}; + PARAMETERS* pp = &cp->params; + int value; cp->stop_time = cp->current_time; cp->state = counter_stopped; - return 0; + if (pp->output_line == 1) + value = 0; + else if (pp->output_line == 2) + value = 1; + else + value = -1; + dprintf(0, "Setting output line to %d\n", value); + HCTR_TEST(hctr_outp(cp->private_data, value)); + return error; +Error: + cntr_errmsg(errBuff, sizeof(errBuff)); + printf("DAQmx Error: %s\n", errBuff); + return error; } int cntr_pause(COUNTER *cp) @@ -434,6 +460,7 @@ static void cntr_test_term(COUNTER* cp) */ int cntr_poll(COUNTER* cp) { + PARAMETERS* pp = &cp->params; char errBuff[2048]={'\0'}; unsigned long long current_count_local; int count_delta_local; @@ -519,6 +546,30 @@ int cntr_poll(COUNTER* cp) cntr_range_check(cp, 1); /* sample range check */ cntr_sample(cp); } + + /* drive the output line */ + if (cp->output_line != pp->output_line) + { + int value; + cp->output_line = pp->output_line; + if (pp->output_line == 1) + { + if (cp->state == counter_running || cp->state == counter_paused) + value = 1; + else + value = 0; + } + else if (pp->output_line == 2) + { + if (cp->state == counter_running || cp->state == counter_paused) + value = 0; + else + value = 1; + } + else + value = -1; + HCTR_TEST(hctr_outp(cp->private_data, value)); + } return error; Error: cntr_errmsg(errBuff, sizeof(errBuff)); diff --git a/site_ansto/hardsup/Monitor/cntr.h b/site_ansto/hardsup/Monitor/cntr.h index a444999d..47c97ae0 100644 --- a/site_ansto/hardsup/Monitor/cntr.h +++ b/site_ansto/hardsup/Monitor/cntr.h @@ -91,6 +91,8 @@ typedef struct counter_t uint64 count64; /** Control parameters */ PARAMETERS params; + /** active value of parameter output_line */ + int output_line; struct counter_private_t* private_data; } COUNTER, *pCOUNTER; diff --git a/site_ansto/hardsup/Monitor/display.c b/site_ansto/hardsup/Monitor/display.c index 6de0a481..cf5c4f21 100644 --- a/site_ansto/hardsup/Monitor/display.c +++ b/site_ansto/hardsup/Monitor/display.c @@ -191,18 +191,27 @@ void put_form(int n) add_double(&buffer, "Range Low", "range_low", pp->range_low); add_double(&buffer, "Range High", "range_high", pp->range_high); add_select_begin(&buffer, "Range Event", "re_check"); + add_option(&buffer, "Disabled", "disabled", pp->range_check_enable == false); add_option(&buffer, "Enabled", "enabled", pp->range_check_enable == true); - add_option(&buffer, "Disabled", "Disabled", pp->range_check_enable == false); add_select_end(&buffer); add_select_begin(&buffer, "Range Gate", "range_gate"); + add_option(&buffer, "Disabled", "disabled", pp->range_gate_enable == false); add_option(&buffer, "Enabled", "enabled", pp->range_gate_enable == true); - add_option(&buffer, "Disabled", "Disabled", pp->range_gate_enable == false); add_select_end(&buffer); add_select_begin(&buffer, "Range Mode", "range_mode"); add_option(&buffer, "Report", "0", pp->range_mode == 0); add_option(&buffer, "Sample", "1", pp->range_mode == 1); add_option(&buffer, "Poll", "2", pp->range_mode == 2); add_select_end(&buffer); + add_select_begin(&buffer, "Output Line", "output"); + add_option(&buffer, "Disabled", "disabled", pp->output_line == 0); + add_option(&buffer, "Enabled", "enabled", pp->output_line == 1); + add_option(&buffer, "Inverted", "inverted", pp->output_line == 2); + add_select_end(&buffer); + add_select_begin(&buffer, "Sync", "sync"); + add_option(&buffer, "Internal", "internal", pp->sync == false); + add_option(&buffer, "External", "external", pp->sync == true); + add_select_end(&buffer); bp = &buffer.body[buffer.length]; snprintf(bp, sizeof(buffer.body) - buffer.length, "\r\n" diff --git a/site_ansto/hardsup/Monitor/hctr.c b/site_ansto/hardsup/Monitor/hctr.c index e898c6fd..0dbaeeb2 100644 --- a/site_ansto/hardsup/Monitor/hctr.c +++ b/site_ansto/hardsup/Monitor/hctr.c @@ -1,12 +1,13 @@ #include "hctr.h" #include +#include #include +#include #include #define DAQmxErrChk(functionCall) \ - if( DAQmxFailed(error=(functionCall)) ) \ - goto Error; \ - else + do { if( DAQmxFailed(error=(functionCall)) ) \ + goto Error; } while(0); /** * This structure encapsulates the data that is private to @@ -21,14 +22,76 @@ typedef struct counter_private_t uInt32 count32; /** extended 64-bit counter value */ unsigned long long count64; + /** NIDAQ device number of card */ + int device_number; + /** NI counter number on card */ + int counter_number; + /** true if using external sync else timer based sampling */ + bool sync; + /** sync line number on the card */ + int sync_line_number; + /** output line number on the card */ + int output_line_number; + /** NIDAQ opaque task handle for digital output */ + TaskHandle taskHandle_dout; } COUNTER_PRIVATE; +typedef struct mapping_t { + int cntr_num; + int sync_num; + int outp_num; +} MAPPING; + +MAPPING mapping[8] = { + { 0, 37, 36 }, + { 1, 33, 32 }, + { 2, 29, 28 }, + { 3, 25, 24 }, + { 4, 21, 20 }, + { 5, 17, 16 }, + { 6, 13, 12 }, + { 7, 9, 8 } +}; + int hctr_ctor(const char* device_name, pHCTR* ptr) { int error = 0; + bool flag = false; + char text_string[] = "dev1/ctr0"; + const char *name; + const char *text; + *ptr = (COUNTER_PRIVATE*) malloc(sizeof(COUNTER_PRIVATE)); memset(*ptr, 0, sizeof(COUNTER_PRIVATE)); + name = device_name; + text = text_string; + while (name && *name) + { + if (isspace(*name)) + ++name; + else if (*name >= '0' && *name <= '7') + { + if (flag) + { + (*ptr)->counter_number = *name - '0'; + (*ptr)->sync_line_number = mapping[(*ptr)->counter_number].sync_num; + (*ptr)->output_line_number = mapping[(*ptr)->counter_number].outp_num; + } + else + { + (*ptr)->device_number = *name - '0'; + flag = true; + } + } + else if (tolower(*name) != *text) + { + /* TODO error */ + break; + } + ++name; + ++text; + } /*********************************************/ // Create a DAQmx task to hold the counter /*********************************************/ @@ -73,6 +136,140 @@ Error: return error; } +int make_dout_task(pHCTR ptr) +{ + int error = 0; + char port_range[40]; + /*********************************************/ + // Create a DAQmx task to hold the counter + /*********************************************/ + DAQmxErrChk (DAQmxCreateTask("",&ptr->taskHandle_dout)); + + /*********************************************/ + // Create the digital channel within the task + /*********************************************/ + snprintf(port_range, sizeof(port_range), "DEV%d/LINE%d", + ptr->device_number, ptr->counter_number); + DAQmxErrChk (DAQmxCreateDOChan(ptr->taskHandle_dout, + port_range, + "", + DAQmx_Val_ChanPerLine)); + + /*********************************************/ + // Start the DAQmx task + /*********************************************/ + DAQmxErrChk (DAQmxStartTask(ptr->taskHandle_dout)); + +Error: + return error; +} + +int hctr_outp(pHCTR hctr, int value) +{ + int error = 0; + uInt8 data; + if (value < 0) { + if (hctr->taskHandle_dout != 0) { + data = 0; + DAQmxWriteDigitalLines(hctr->taskHandle_dout, + 1, + 1, + 10.0, + DAQmx_Val_GroupByChannel, + &data, + NULL, + NULL); + /*********************************************/ + // DAQmx Stop Code + /*********************************************/ + DAQmxStopTask(hctr->taskHandle_dout); + DAQmxClearTask(hctr->taskHandle_dout); + hctr->taskHandle_dout = 0; + } + return error; + } + if (hctr->taskHandle_dout == 0) + DAQmxErrChk (make_dout_task(hctr)); + if (value > 0) + data = 1; + else + data = 0; +#if 0 + DAQmxErrChk ( + DAQmxWriteDigitalLines(hctr->taskHandle_dout, + 1, + 1, + 10.0, + DAQmx_Val_GroupByChannel, + &data, + NULL, + NULL)); +#else + DAQmxErrChk ( + DAQmxWriteDigitalScalarU32(hctr->taskHandle_dout, + 1, + 10.0, + data, + NULL)); +#endif +Error: + return error; +} + +void hctr_sync(pHCTR hctr, bool external) +{ + int error = 0; + char device_name[40]; + if (hctr->sync != external) + { + hctr->sync = external; + /*********************************************/ + // DAQmx Stop Code + /*********************************************/ + DAQmxStopTask(hctr->taskHandle); + DAQmxClearTask(hctr->taskHandle); + /*********************************************/ + // Create a DAQmx task to hold the counter + /*********************************************/ + DAQmxErrChk (DAQmxCreateTask("",&hctr->taskHandle)); + + /*********************************************/ + // Create a DAQmx counter within the task + /*********************************************/ + hctr->count32 = 0; + snprintf(device_name, sizeof(device_name), "dev%d/ctr%d", + hctr->device_number, hctr->counter_number); + DAQmxErrChk ( + DAQmxCreateCICountEdgesChan(hctr->taskHandle, + device_name, + "", + DAQmx_Val_Rising, + hctr->count32, + DAQmx_Val_CountUp)); + + if (external) + { + char str[40]; + snprintf(str, sizeof(str), "dev%d/PFI%d", + hctr->device_number, hctr->sync_line_number); + DAQmxErrChk ( + DAQmxCfgSampClkTiming(hctr->taskHandle, + str, + 10000, + DAQmx_Val_Rising, + DAQmx_Val_ContSamps, + 10000)); + } + /*********************************************/ + // Start the DAQmx task + /*********************************************/ + DAQmxErrChk (DAQmxStartTask(hctr->taskHandle)); + + } +Error: + return; +} + int hctr_dtor(pHCTR* hctr) { if( hctr && *hctr && (*hctr)->taskHandle!=0 ) @@ -84,6 +281,15 @@ int hctr_dtor(pHCTR* hctr) DAQmxClearTask((*hctr)->taskHandle); } (*hctr)->taskHandle = 0; + if( hctr && *hctr && (*hctr)->taskHandle_dout!=0 ) + { + /*********************************************/ + // DAQmx Stop Code + /*********************************************/ + DAQmxStopTask((*hctr)->taskHandle_dout); + DAQmxClearTask((*hctr)->taskHandle_dout); + } + (*hctr)->taskHandle_dout = 0; free (*hctr); *hctr = NULL; return 0; diff --git a/site_ansto/hardsup/Monitor/hctr.h b/site_ansto/hardsup/Monitor/hctr.h index f45ae51e..2c3249d0 100644 --- a/site_ansto/hardsup/Monitor/hctr.h +++ b/site_ansto/hardsup/Monitor/hctr.h @@ -38,6 +38,25 @@ int hctr_ctor(const char* device_name, pHCTR* ptr); */ int hctr_read(pHCTR hctr, unsigned long long* value); +/** + * Enables external sync on designated (up/down) line + * + * \param hctr pointer to opaque private data structure + * \param value to be written to the associated line + * < 0 disconnect + * = 0 logic low + * > 0 logic high + */ +int hctr_outp(pHCTR hctr, int value); + +/** + * Enables external sync on designated (up/down) line + * + * \param hctr pointer to opaque private data structure + * \param external true for external sync, false for internal + */ +void hctr_sync(pHCTR hctr, bool external); + /** * Destroy the 64-bit counter * diff --git a/site_ansto/hardsup/Monitor/params.c b/site_ansto/hardsup/Monitor/params.c index 656d63f8..4f1e5b8f 100644 --- a/site_ansto/hardsup/Monitor/params.c +++ b/site_ansto/hardsup/Monitor/params.c @@ -15,6 +15,8 @@ #define CMD_RE_CHECK 10 #define CMD_RANGE_GATE 11 #define CMD_RANGE_MODE 12 +#define CMD_OUTPUT 13 +#define CMD_SYNC 14 #define TXT_DIRECTION "DIRECTION" #define TXT_SCAN "SCAN" @@ -28,6 +30,8 @@ #define TXT_RE_CHECK "RE_CHECK" #define TXT_RANGE_GATE "RANGE_GATE" #define TXT_RANGE_MODE "RANGE_MODE" +#define TXT_OUTPUT "OUTPUT" +#define TXT_SYNC "SYNC" static struct param_command_t { int cmd; @@ -45,156 +49,166 @@ static struct param_command_t { {CMD_RE_CHECK, TXT_RE_CHECK}, {CMD_RANGE_GATE, TXT_RANGE_GATE}, {CMD_RANGE_MODE, TXT_RANGE_MODE}, + {CMD_OUTPUT, TXT_OUTPUT}, + {CMD_SYNC, TXT_SYNC}, {0, NULL} }; +#define NUM_CMDS (sizeof(param_command)/sizeof(param_command[0])) + +static int name_to_command(char* name) +{ + int i; + for (i = 0; i < NUM_CMDS; ++i) { + if (param_command[i].txt == NULL) + return -1; + if (strcasecmp(name, param_command[i].txt) == 0) + return param_command[i].cmd; + } + return -1; +} bool param_set(pPARAMETERS pp, char* name, char* value) { bool result = false; - switch (name[0]) + switch (name_to_command(name)) { - case 'd': - case 'D': - if (strcasecmp(name, TXT_DIRECTION) == 0) - { - result = true; - dprintf(0, "Direction=%s", pp->direction ? "Down" : "Up"); - if (strcasecmp(value, "down") == 0) - pp->direction = COUNT_DOWN; - else - pp->direction = COUNT_UP; - dprintf(0, "=>%s\n", pp->direction ? "Down" : "Up"); - } + case CMD_DIRECTION: + result = true; + dprintf(0, "Direction=%s", pp->direction ? "Down" : "Up"); + if (strcasecmp(value, "down") == 0) + pp->direction = COUNT_DOWN; + else + pp->direction = COUNT_UP; + dprintf(0, "=>%s\n", pp->direction ? "Down" : "Up"); break; - case 'i': - case 'I': - if (strcasecmp(name, TXT_INITIAL) == 0) - { - result = true; - dprintf(0, "Initial=%llu", pp->initial_count); - pp->initial_count = strtoull(value, NULL, 10); - dprintf(0, "=>%llu\n", pp->initial_count); - } + case CMD_INITIAL: + result = true; + dprintf(0, "Initial=%llu", pp->initial_count); + pp->initial_count = strtoull(value, NULL, 10); + dprintf(0, "=>%llu\n", pp->initial_count); break; - case 'r': - case 'R': - if (strcasecmp(name, TXT_REPORT) == 0) - { - result = true; - dprintf(0, "Report=%d", pp->report_period); - pp->report_period = strtol(value, NULL, 10); - if (pp->report_period < 1) - pp->report_period = 1; - else if (pp->report_period > 1000) - pp->report_period = 1000; - dprintf(0, "=>%d\n", pp->report_period); - } - else if (strcasecmp(name, TXT_RANGE_MODE) == 0) - { - result = true; - dprintf(0, "range_mode=%d", pp->range_mode); - pp->range_mode = strtol(value, NULL, 10); - if (pp->range_mode < 0) - pp->range_mode = 0; - else if (pp->range_mode > 2) - pp->range_mode = 0; - dprintf(0, "=>%d\n", pp->range_mode); - } - else if (strcasecmp(name, TXT_RANGE_GATE) == 0) - { - result = true; - dprintf(0, "range_gate=%s", - pp->range_gate_enable ? "Enabled" : "Disabled"); - if (strcasecmp(value, "enabled") == 0) - pp->range_gate_enable = true; - else - pp->range_gate_enable = false; - dprintf(0, "=>%s\n", - pp->range_gate_enable ? "Enabled" : "Disabled"); - } - else if (strcasecmp(name, TXT_RE_CHECK) == 0) - { - result = true; - dprintf(0, "RE_Check=%s", - pp->range_check_enable ? "Enabled" : "Disabled"); - if (strcasecmp(value, "enabled") == 0) - pp->range_check_enable = true; - else - pp->range_check_enable = false; - dprintf(0, "=>%s\n", - pp->range_check_enable ? "Enabled" : "Disabled"); - } - else if (strcasecmp(name, TXT_RANGE_HIGH) == 0) - { - result = true; - dprintf(0, "RangeHigh=%g", pp->range_high); - pp->range_high = strtod(value, NULL); - if (pp->range_high < 0.0) - pp->range_high = 0.0; - dprintf(0, "=>%g\n", pp->range_high); - } - else if (strcasecmp(name, TXT_RANGE_LOW) == 0) - { - result = true; - dprintf(0, "RangeLow=%g", pp->range_low); - pp->range_low = strtod(value, NULL); - if (pp->range_low < 0.0) - pp->range_low = 0.0; - dprintf(0, "=>%g\n", pp->range_low); - } + case CMD_OUTPUT: + result = true; + dprintf(0, "Direction=%s", pp->output_line == 2 ? "Inverted": + pp->output_line == 1 ? "Enabled" : "Disabled"); + if (strcasecmp(value, "enabled") == 0) + pp->output_line = 1; + else if (strcasecmp(value, "inverted") == 0) + pp->output_line = 2; + else + pp->output_line = 0; + dprintf(0, "=>%s\n", pp->output_line == 2 ? "Inverted": + pp->output_line == 1 ? "Enabled" : "Disabled"); break; - case 's': - case 'S': - if (strcasecmp(name, TXT_SCAN) == 0) - { - result = true; - dprintf(0, "Scan=%d", pp->poll_period); - pp->poll_period = strtol(value, NULL, 10); - if (pp->poll_period < 1) - pp->poll_period = 1; - else if (pp->poll_period > 1000) - pp->poll_period = 1000; - dprintf(0, "=>%d\n", pp->poll_period); - } - else if (strcasecmp(name, TXT_SAMPLE) == 0) - { - result = true; - dprintf(0, "Sample=%d", pp->sample_period); - pp->sample_period = strtol(value, NULL, 10); - if (pp->sample_period < 1) - pp->sample_period = 1; - else if (pp->sample_period > 1000) - pp->sample_period = 1000; - dprintf(0, "=>%d\n", pp->sample_period); - } + case CMD_REPORT: + result = true; + dprintf(0, "Report=%d", pp->report_period); + pp->report_period = strtol(value, NULL, 10); + if (pp->report_period < 1) + pp->report_period = 1; + else if (pp->report_period > 1000) + pp->report_period = 1000; + dprintf(0, "=>%d\n", pp->report_period); break; - case 't': - case 'T': - if (strcasecmp(name, TXT_TERMINAL) == 0) - { - result = true; - dprintf(0, "Sample=%llu", pp->terminal_count); - pp->terminal_count = strtoull(value, NULL, 10); - dprintf(0, "=>%llu\n", pp->terminal_count); - } - else if (strcasecmp(name, TXT_TE_CHECK) == 0) - { - result = true; - dprintf(0, "TE_Check=%s", - pp->terminal_check_type == 0 ? "None" : - pp->terminal_check_type == 1 ? "Counter" : - pp->terminal_check_type == 2 ? "Timer" : "Unknown"); - if (strcasecmp(value, "counter") == 0) - pp->terminal_check_type = 1; - else if (strcasecmp(value, "timer") == 0) - pp->terminal_check_type = 2; - else - pp->terminal_check_type = 0; - dprintf(0, "=>%s\n", - pp->terminal_check_type == 0 ? "None" : - pp->terminal_check_type == 1 ? "Counter" : - pp->terminal_check_type == 2 ? "Timer" : "Unknown"); - } + case CMD_RANGE_MODE: + result = true; + dprintf(0, "range_mode=%d", pp->range_mode); + pp->range_mode = strtol(value, NULL, 10); + if (pp->range_mode < 0) + pp->range_mode = 0; + else if (pp->range_mode > 2) + pp->range_mode = 0; + dprintf(0, "=>%d\n", pp->range_mode); + break; + case CMD_RANGE_GATE: + result = true; + dprintf(0, "range_gate=%s", + pp->range_gate_enable ? "Enabled" : "Disabled"); + if (strcasecmp(value, "enabled") == 0) + pp->range_gate_enable = true; + else + pp->range_gate_enable = false; + dprintf(0, "=>%s\n", + pp->range_gate_enable ? "Enabled" : "Disabled"); + break; + case CMD_RE_CHECK: + result = true; + dprintf(0, "RE_Check=%s", + pp->range_check_enable ? "Enabled" : "Disabled"); + if (strcasecmp(value, "enabled") == 0) + pp->range_check_enable = true; + else + pp->range_check_enable = false; + dprintf(0, "=>%s\n", + pp->range_check_enable ? "Enabled" : "Disabled"); + break; + case CMD_RANGE_HIGH: + result = true; + dprintf(0, "RangeHigh=%g", pp->range_high); + pp->range_high = strtod(value, NULL); + if (pp->range_high < 0.0) + pp->range_high = 0.0; + dprintf(0, "=>%g\n", pp->range_high); + break; + case CMD_RANGE_LOW: + result = true; + dprintf(0, "RangeLow=%g", pp->range_low); + pp->range_low = strtod(value, NULL); + if (pp->range_low < 0.0) + pp->range_low = 0.0; + dprintf(0, "=>%g\n", pp->range_low); + break; + case CMD_SCAN: + result = true; + dprintf(0, "Scan=%d", pp->poll_period); + pp->poll_period = strtol(value, NULL, 10); + if (pp->poll_period < 1) + pp->poll_period = 1; + else if (pp->poll_period > 1000) + pp->poll_period = 1000; + dprintf(0, "=>%d\n", pp->poll_period); + break; + case CMD_SAMPLE: + result = true; + dprintf(0, "Sample=%d", pp->sample_period); + pp->sample_period = strtol(value, NULL, 10); + if (pp->sample_period < 1) + pp->sample_period = 1; + else if (pp->sample_period > 1000) + pp->sample_period = 1000; + dprintf(0, "=>%d\n", pp->sample_period); + break; + case CMD_SYNC: + result = true; + dprintf(0, "Sync=%s", pp->sync ? "External" : "Internal"); + if (strcasecmp(value, "external") == 0) + pp->sync = true; + else + pp->sync = false; + dprintf(0, "=>%s\n", pp->sync ? "External" : "Internal"); + break; + case CMD_TERMINAL: + result = true; + dprintf(0, "Sample=%llu", pp->terminal_count); + pp->terminal_count = strtoull(value, NULL, 10); + dprintf(0, "=>%llu\n", pp->terminal_count); + break; + case CMD_TE_CHECK: + result = true; + dprintf(0, "TE_Check=%s", + pp->terminal_check_type == 0 ? "None" : + pp->terminal_check_type == 1 ? "Counter" : + pp->terminal_check_type == 2 ? "Timer" : "Unknown"); + if (strcasecmp(value, "counter") == 0) + pp->terminal_check_type = 1; + else if (strcasecmp(value, "timer") == 0) + pp->terminal_check_type = 2; + else + pp->terminal_check_type = 0; + dprintf(0, "=>%s\n", + pp->terminal_check_type == 0 ? "None" : + pp->terminal_check_type == 1 ? "Counter" : + pp->terminal_check_type == 2 ? "Timer" : "Unknown"); break; default: dprintf(0, "Unknown Parameter: \"%s\" = \"%s\"\n", name, value); @@ -257,10 +271,90 @@ bool param_get_cmd(pPARAMETERS pp, char* cmd, int n) } name[len] = '\0'; - switch (name[0]) + switch (name_to_command(name)) { - case 'a': - case 'A': + case CMD_DIRECTION: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%s", name, + pp->direction ? "Down" : "Up"); + break; + case CMD_INITIAL: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%llu", name, + pp->initial_count); + break; + case CMD_OUTPUT: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%s", name, + pp->output_line == 2 ? "Inverted": + pp->output_line == 1 ? "Enabled" : "Disabled"); + break; + case CMD_REPORT: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%d", name, + pp->report_period); + break; + case CMD_RANGE_GATE: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%s", name, + pp->range_gate_enable ? "Enabled" : "Disabled"); + break; + case CMD_RE_CHECK: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%s", name, + pp->range_check_enable ? "Enabled" : "Disabled"); + break; + case CMD_RANGE_MODE: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%d", name, + pp->range_mode); + break; + case CMD_RANGE_HIGH: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%g", name, + pp->range_high); + break; + case CMD_RANGE_LOW: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%g", name, + pp->range_low); + break; + case CMD_SCAN: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%d", name, + pp->poll_period); + break; + case CMD_SAMPLE: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%d", name, + pp->sample_period); + break; + case CMD_TERMINAL: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%llu", name, + pp->terminal_count); + break; + case CMD_TE_CHECK: + result = true; + snprintf(buffer.body, sizeof(buffer.body), + "GET %s=%s", name, + pp->terminal_check_type == 0 ? "None" : + pp->terminal_check_type == 1 ? "Counter" : + pp->terminal_check_type == 2 ? "Timer" : "Unknown"); + break; + default: if (strcasecmp(name, "ALL") == 0) { int i; @@ -269,110 +363,8 @@ bool param_get_cmd(pPARAMETERS pp, char* cmd, int n) strcpy(buffer.body, "OK"); result = true; } - break; - case 'd': - case 'D': - if (strcasecmp(name, TXT_DIRECTION) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%s", name, - pp->direction ? "Down" : "Up"); - } - break; - case 'i': - case 'I': - if (strcasecmp(name, TXT_INITIAL) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%llu", name, - pp->initial_count); - } - break; - case 'r': - case 'R': - if (strcasecmp(name, TXT_REPORT) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%d", name, - pp->report_period); - } - else if (strcasecmp(name, TXT_RANGE_GATE) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%s", name, - pp->range_gate_enable ? "Enabled" : "Disabled"); - } - else if (strcasecmp(name, TXT_RE_CHECK) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%s", name, - pp->range_check_enable ? "Enabled" : "Disabled"); - } - else if (strcasecmp(name, TXT_RANGE_MODE) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%d", name, - pp->range_mode); - } - else if (strcasecmp(name, TXT_RANGE_HIGH) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%g", name, - pp->range_high); - } - else if (strcasecmp(name, TXT_RANGE_LOW) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%g", name, - pp->range_low); - } - break; - case 's': - case 'S': - if (strcasecmp(name, TXT_SCAN) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%d", name, - pp->poll_period); - } - else if (strcasecmp(name, TXT_SAMPLE) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%d", name, - pp->sample_period); - } - break; - case 't': - case 'T': - if (strcasecmp(name, TXT_TERMINAL) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%llu", name, - pp->terminal_count); - } - else if (strcasecmp(name, TXT_TE_CHECK) == 0) - { - result = true; - snprintf(buffer.body, sizeof(buffer.body), - "GET %s=%s", name, - pp->terminal_check_type == 0 ? "None" : - pp->terminal_check_type == 1 ? "Counter" : - pp->terminal_check_type == 2 ? "Timer" : "Unknown"); - } - break; - default: - dprintf(0, "Unknown GET Parameter: \"%s\"\n", name); + else + dprintf(0, "Unknown GET Parameter: \"%s\"\n", name); break; } if (!result) diff --git a/site_ansto/hardsup/Monitor/params.h b/site_ansto/hardsup/Monitor/params.h index 3891c0fd..282d5603 100644 --- a/site_ansto/hardsup/Monitor/params.h +++ b/site_ansto/hardsup/Monitor/params.h @@ -35,6 +35,10 @@ typedef struct parameter_t bool range_gate_enable; /** mode = 0:report, 1:sample, 2:poll */ int range_mode; + /** output = 0:disabled, 1:enabled, 2:inverted */ + int output_line; + /** hardware_sync false:internal, true:external */ + bool sync; } PARAMETERS, *pPARAMETERS;