PyObject *pv_getter_pvtime(pvobject * self, void *closure) { struct timespec posixtime; if (self->chanId && self->buff != NULL) { epicsTimeToTimespec(&posixtime, &self->buff->stamp); return PyFloat_FromDouble((double)posixtime.tv_sec + (double)posixtime.tv_nsec * 1e-9); } else { PYCA_ERR("pvtime: indef"); } }
/* * Process records to save waveform data */ static long wave2rootDataProcess(aSubRecord *record) { if (wave2rootDebug > 2) printf("Record %s called wave2rootDataProcess(%p)\n", record->name, (void*) record); // daq_state: 0 = writing, 1 = stopped epicsEnum16 daq_state = *(epicsEnum16*) (record->c); // convert EPICS time to POSIX time struct timespec posixTime = { 0, 0 }; epicsTimeToTimespec(&posixTime, &record->time); // save previous timestamp, posixTime, and data, vala, to file if (!daq_state && posixTime.tv_sec > 0) { if (GetBufferSize() < 1000) { WriteRootFile(record->b, &posixTime, record->vala, record->noa); } else { printf("Buffer length exceeds 1000, exiting the program!"); return 1; } } if (wave2rootDebug > 2) { struct tm tsLocal = *localtime(&posixTime.tv_sec); char timeString[128]; // Reserve string for timestamp strftime(timeString, sizeof(timeString), "%Z %a %Y-%m-%d %H:%M:%S", &tsLocal); char nsTime[64]; sprintf(nsTime, "%ld", posixTime.tv_nsec); /* if (strcmp(record->b, "halld-pxi:array:vtt4") == 0) */ /* printf("%s : %s.%s %8.5f %8.5f \n", (char*) record->b, */ /* timeString, nsTime, ((float*) record->a)[5000 - 1], */ /* ((float*) record->vala)[5000 - 1]); */ } // update file name and size const char* file_name = GetFileName(); long file_size = GetFileSize(); strcpy(record->vald, file_name); ((long*) record->vale)[0] = file_size; // copy updated data to vala memcpy(record->vala, record->a, record->noa * (sizeof(float))); return 0; }
static void ClockTimeSync(void *dummy) { taskwdInsert(0, NULL, NULL); for (epicsEventWaitWithTimeout(ClockTimePvt.loopEvent, ClockTimeSyncInterval); ClockTimePvt.synchronize == CLOCKTIME_SYNC; epicsEventWaitWithTimeout(ClockTimePvt.loopEvent, ClockTimeSyncInterval)) { epicsTimeStamp timeNow; int priority; if (generalTimeGetExceptPriority(&timeNow, &priority, LAST_RESORT_PRIORITY) == epicsTimeOK) { struct timespec clockNow; epicsTimeToTimespec(&clockNow, &timeNow); if (clock_settime(CLOCK_REALTIME, &clockNow)) { errlogPrintf("ClockTimeSync: clock_settime failed\n"); continue; } epicsMutexMustLock(ClockTimePvt.lock); if (!ClockTimePvt.synchronized) { ClockTimePvt.startTime = timeNow; ClockTimePvt.synchronized = 1; } ClockTimePvt.syncFromPriority = priority; ClockTimePvt.syncTime = timeNow; epicsMutexUnlock(ClockTimePvt.lock); } } ClockTimePvt.synchronized = 0; taskwdRemove(0); }