40 static int tsInitS = 0;
41 static int tsInitC = 0;
58 #define TIMETEXTLEN 28 64 if (outType ==
bin && val != 0) {
68 for (i = 31; i >= 0; i--) {
69 int bit = (val >>
i) & 1;
71 if (skip < 0 && bit) {
76 ret[31-i-skip] =
'0' + bit;
81 const char *fmt[4] = {
89 sprintf(ret, fmt[outType], (
int) val);
119 strcpy (str,
"*** invalid type");
143 sprint_long(str, val_long,
outTypeF);
154 sprint_long(str, val_long,
outTypeF);
159 sprintf(str,
"%d", ch);
172 sprintf(str,
"Illegal Value (%d)", val[index]);
174 sprintf(str,
"Enum Index Overflow (%d)", val[index]);
179 sprintf(str,
"Illegal Value (%d)", val[index]);
181 sprintf(str,
"Enum Index Overflow (%d)", val[index]);
185 sprintf(str,
"%d", val[index]);
211 #define ARGS_TIME(T) \ 218 #define ARGS_STS(T) \ 219 stat_to_str(((struct T *)value)->status), \ 220 sevr_to_str(((struct T *)value)->severity) 222 #define ARGS_STS_UNSIGNED(T) \ 223 stat_to_str_unsigned(((struct T *)value)->status), \ 224 sevr_to_str_unsigned(((struct T *)value)->severity) 227 " Ack transient?: %s\n" \ 230 #define ARGS_ACK(T) \ 231 ((struct T *)value)->ackt ? "YES" : "NO", \ 232 sevr_to_str_unsigned(((struct T *)value)->acks) 237 #define ARGS_UNITS(T) \ 238 ((struct T *)value)->units 243 #define ARGS_PREC(T) \ 244 ((struct T *)value)->precision 246 #define FMT_GR(FMT) \ 247 " Lo disp limit: " #FMT "\n" \ 248 " Hi disp limit: " #FMT "\n" \ 249 " Lo alarm limit: " #FMT "\n" \ 250 " Lo warn limit: " #FMT "\n" \ 251 " Hi warn limit: " #FMT "\n" \ 252 " Hi alarm limit: " #FMT 254 #define ARGS_GR(T,F) \ 255 (F)((struct T *)value)->lower_disp_limit, \ 256 (F)((struct T *)value)->upper_disp_limit, \ 257 (F)((struct T *)value)->lower_alarm_limit, \ 258 (F)((struct T *)value)->lower_warning_limit, \ 259 (F)((struct T *)value)->upper_warning_limit, \ 260 (F)((struct T *)value)->upper_alarm_limit 262 #define FMT_CTRL(FMT) \ 263 " Lo ctrl limit: " #FMT "\n" \ 264 " Hi ctrl limit: " #FMT 266 #define ARGS_CTRL(T,F) \ 267 (F)((struct T *)value)->lower_ctrl_limit, \ 268 (F)((struct T *)value)->upper_ctrl_limit 273 #define PRN_DBR_STS(T) \ 278 #define PRN_DBR_TIME(T) \ 279 epicsTimeToStrftime(timeText, TIMETEXTLEN, timeFormatStr, \ 280 &(((struct T *)value)->stamp)); \ 282 FMT_TIME "\n" FMT_STS, \ 283 ARGS_TIME(T), ARGS_STS(T)) 285 #define PRN_DBR_GR(T,F,FMT) \ 287 FMT_STS "\n" FMT_UNITS "\n" FMT_GR(FMT), \ 288 ARGS_STS(T), ARGS_UNITS(T), ARGS_GR(T,F)) 290 #define PRN_DBR_GR_PREC(T,F,FMT) \ 292 FMT_STS "\n" FMT_UNITS "\n" FMT_PREC "\n" FMT_GR(FMT), \ 293 ARGS_STS(T), ARGS_UNITS(T), ARGS_PREC(T), ARGS_GR(T,F)) 295 #define PRN_DBR_CTRL(T,F,FMT) \ 297 FMT_STS "\n" FMT_UNITS "\n" FMT_GR(FMT) "\n" FMT_CTRL(FMT), \ 298 ARGS_STS(T), ARGS_UNITS(T), ARGS_GR(T,F), ARGS_CTRL(T,F)) 300 #define PRN_DBR_CTRL_PREC(T,F,FMT) \ 302 FMT_STS "\n" FMT_UNITS "\n" FMT_PREC "\n" FMT_GR(FMT) "\n" FMT_CTRL(FMT), \ 303 ARGS_STS(T), ARGS_UNITS(T), ARGS_PREC(T), ARGS_GR(T,F), ARGS_CTRL(T,F)) 305 #define PRN_DBR_STSACK(T) \ 307 FMT_STS "\n" FMT_ACK, \ 308 ARGS_STS_UNSIGNED(T), ARGS_ACK(T)) 310 #define PRN_DBR_X_ENUM(T) \ 311 n = ((struct T *)value)->no_str; \ 313 sprintf(str+strlen(str), \ 314 "\n Enums: (%2d)", n); \ 315 for (i=0; i<n; i++) \ 316 sprintf(str+strlen(str), \ 318 ((struct T *)value)->strs[i]); 322 #define DBR_PRINT_BUFFER_SIZE \ 326 + 20 + MAX_UNITS_SIZE \ 330 + 30 + (MAX_ENUM_STATES * (20 + MAX_ENUM_STRING_SIZE)) \ 392 default : strcpy (str,
"can't print data type");
411 #define PRN_TIME_VAL_STS(TYPE,TYPE_ENUM) \ 412 printAbs = !pv->firstStampPrinted; \ 414 ptsNewS = &((struct TYPE *)value)->stamp; \ 419 tsFirst = *ptsNewS; \ 425 ptsRefC = &tsStart; \ 426 ptsRefS = &tsFirst; \ 429 ptsRefC = &tsPreviousC; \ 430 ptsRefS = &tsPreviousS; \ 432 case incrementalByChan: \ 433 ptsRefC = &pv->tsPreviousC; \ 434 ptsRefS = &pv->tsPreviousS; \ 442 epicsTimeToStrftime(timeText, TIMETEXTLEN, timeFormatStr, ptsNewS); \ 443 printf("%s", timeText); \ 446 epicsTimeToStrftime(timeText, TIMETEXTLEN, timeFormatStr, ptsNewC); \ 447 printf("(%s)", timeText); \ 449 pv->firstStampPrinted = 1; \ 452 printf(" %+12.6f", epicsTimeDiffInSeconds(ptsNewS, ptsRefS) ); \ 455 printf(" (%+12.6f)", epicsTimeDiffInSeconds(ptsNewC, ptsRefC) ); \ 459 if (tsType == incrementalByChan) { \ 460 pv->tsPreviousC = *ptsNewC; \ 461 pv->tsPreviousS = *ptsNewS; \ 464 tsPreviousC = *ptsNewC; \ 465 tsPreviousS = *ptsNewS; \ 467 if (charArrAsStr && dbr_type_is_CHAR(TYPE_ENUM) && (reqElems || pv->nElems > 1)) { \ 468 dbr_char_t *s = (dbr_char_t*) dbr_value_ptr(pv->value, pv->dbrType); \ 469 size_t len = strlen((char*)s); \ 470 unsigned long elems = reqElems && (reqElems < pv->nElems) ? reqElems : pv->nElems; \ 473 if (len < elems) elems = len; \ 474 dlen = epicsStrnEscapedFromRawSize((char*)s, elems); \ 475 d = calloc(dlen+1, sizeof(char)); \ 477 epicsStrnEscapedFromRaw(d, dlen+1, (char*)s, elems); \ 478 printf("%c%s", fieldSeparator, d); \ 481 printf("Failed to allocate for print_time_val_sts\n"); \ 484 if (reqElems || pv->nElems > 1) printf("%c%lu", fieldSeparator, pv->nElems); \ 485 for (i=0; i<pv->nElems; ++i) { \ 486 printf("%c%s", fieldSeparator, val2str(value, TYPE_ENUM, i)); \ 490 if ( ((struct TYPE *)value)->status || ((struct TYPE *)value)->severity ) \ 492 printf("%c%s%c%s\n", \ 494 stat_to_str(((struct TYPE *)value)->status), \ 496 sevr_to_str(((struct TYPE *)value)->severity)); \ 499 fieldSeparator, fieldSeparator); \ 519 printf(
"*** Not connected (PV not found)\n");
521 printf(
"%s *** disconnected\n", timeText);
523 printf(
"%s *** no read access\n", timeText);
526 else if (pv->
value == 0)
527 printf(
"%s *** no data available (timeout)\n", timeText);
551 default:
printf(
"can't print data type\n");
586 for (n = 0; n < nPvs; n++) {
593 fprintf(
stderr,
"CA error %s occurred while trying " 594 "to create channel '%s'.\n",
ca_message(result), pvs[n].name);
624 if ( returncode == 0 ) {
631 fprintf(
stderr,
"Channel connect timed out: some PV(s) not found.\n");
633 fprintf(
stderr,
"Channel connect timed out: '%s' not found.\n",
void caCh(struct connection_handler_args args)
int epicsStdCall ca_create_channel(const char *name_str, caCh *conn_func, void *puser, capri priority, chid *chanptr)
int epicsStdCall ca_pend_io(ca_real timeout)
pvd::StructureConstPtr type
#define dbr_type_is_valid(type)
#define DBR_STSACK_STRING
#define dbr_value_ptr(PDBR, DBR_TYPE)
LIBCOM_API size_t epicsStdCall epicsTimeToStrftime(char *pBuff, size_t bufLength, const char *pFormat, const epicsTimeStamp *pTS)
Convert epicsTimeStamp to string. See epicsTime::strftime()
#define dbr_type_is_CTRL(type)
int epicsStdCall epicsTimeGetCurrent(epicsTimeStamp *pDest)
Get current time into *pDest.
epicsFloat64 dbr_double_t
epicsOldString dbr_string_t
const char *epicsStdCall ca_message(long ca_status)
EPICS time stamp, for use from C code.
EPICS time-stamps (epicsTimeStamp), epicsTime C++ class and C functions for handling wall-clock times...
#define dbr_type_is_GR(type)
int epicsStrnEscapedFromRaw(char *dst, size_t dstlen, const char *src, size_t srclen)
char strs[MAX_ENUM_STATES][MAX_ENUM_STRING_SIZE]