Draft Stream Device Rewrite of Counterbox Driver

This commit is contained in:
2024-10-18 13:18:43 +02:00
commit d612f5c565
11 changed files with 930 additions and 0 deletions

60
src/counterbox.cpp Normal file
View File

@ -0,0 +1,60 @@
#include <epicsExport.h>
#include <string.h>
#include <string>
#include <stringinRecord.h>
#define update_val(prec, new_val) \
{ \
static_assert(std::char_traits<char>::length((new_val)) < MAX_SIZE, \
"New Val Exceeds Max String Length"); \
strncpy((prec)->val, (new_val), MAX_SIZE); \
}
static long map_raw_failure_message(struct stringinRecord *prec) {
const uint8_t MAX_SIZE = 40; // including null terminator
if (strcmp(prec->val, "?OF") == 0) {
update_val(prec, "?OF: Configuration Error");
} else if (strcmp(prec->val, "?OV") == 0) {
update_val(prec, "?OV: Overflow");
} else if (strcmp(prec->val, "?1") == 0) {
update_val(prec, "?1: Parameter out of range");
} else if (strcmp(prec->val, "?2") == 0) {
update_val(prec, "?2: Bad command");
} else if (strcmp(prec->val, "?3") == 0) {
update_val(prec, "?3: Bad parameter");
} else if (strcmp(prec->val, "?4") == 0) {
update_val(prec, "?4: Bad counter");
} else if (strcmp(prec->val, "?5") == 0) {
update_val(prec, "?5: Parameter missing");
} else if (strcmp(prec->val, "?6") == 0) {
update_val(prec, "?6: Too many counts");
} else if (strcmp(prec->val, "?91") == 0) {
update_val(prec, "?91: Start Failure");
} else if (strcmp(prec->val, "?92") == 0) {
update_val(prec, "?92: Failure while counting");
} else if (strcmp(prec->val, "?93") == 0) {
update_val(prec, "?93: Read Failure");
} else if (strstr(prec->val, "?") != NULL) {
char val_copy[40] = {0};
strncpy(val_copy, prec->val, MAX_SIZE);
snprintf(prec->val, MAX_SIZE - 1, "%s: HW error", val_copy);
} else {
// Leave the message as is
}
return 0; // returns: (-1,0)=>(failure,success)
}
struct {
long number;
DEVSUPFUN report;
DEVSUPFUN init;
DEVSUPFUN init_record;
DEVSUPFUN get_ioint_info;
DEVSUPFUN read_ai;
DEVSUPFUN special_linconv;
} devCounterBoxStringError = {
6, NULL, NULL, NULL, NULL, (DEVSUPFUN)map_raw_failure_message, NULL};
epicsExportAddress(dset, devCounterBoxStringError);

5
src/counterbox.dbd Normal file
View File

@ -0,0 +1,5 @@
#---------------------------------------------
# Counterbox specific DB definitions
#---------------------------------------------
device(stringin,INST_IO,devCounterBoxStringError,"devCounterBoxStringError")