@table @code
@item PPS
Pulse per second (PPS) API driver. The parameter is a path to the PPS
-device. Assert events are used by default. The path can have
-:1 appended to use clear events instead.
+device. Assert events are used by default. Driver option
+@code{:clear} can be appended to the path to use clear events instead.
PPS refclock needs another source (NTP or non-PPS refclock) or local
directive (@pxref{local directive}) enabled to function. For example:
RefclockDriver *driver;
void *data;
char *driver_parameter;
+ int driver_parameter_length;
int driver_poll;
int driver_polled;
int poll;
inst->data = NULL;
inst->driver_parameter = params->driver_parameter;
+ inst->driver_parameter_length = 0;
inst->driver_poll = params->driver_poll;
inst->poll = params->poll;
inst->missed_samples = 0;
inst->timeout_id = -1;
inst->source = NULL;
+ if (inst->driver_parameter) {
+ int i;
+
+ inst->driver_parameter_length = strlen(inst->driver_parameter);
+ for (i = 0; i < inst->driver_parameter_length; i++)
+ if (inst->driver_parameter[i] == ':')
+ inst->driver_parameter[i] = '\0';
+ }
+
if (pps_source) {
if (inst->pps_rate < 1)
inst->pps_rate = 1;
return instance->driver_parameter;
}
+char *
+RCL_GetDriverOption(RCL_Instance instance, char *name)
+{
+ char *s, *e;
+ int n;
+
+ s = instance->driver_parameter;
+ e = s + instance->driver_parameter_length;
+ n = strlen(name);
+
+ while (1) {
+ s += strlen(s) + 1;
+ if (s >= e)
+ break;
+ if (!strncmp(name, s, n)) {
+ if (s[n] == '=')
+ return s + n + 1;
+ if (s[n] == '\0')
+ return s + n;
+ }
+ }
+
+ return NULL;
+}
+
int
RCL_AddSample(RCL_Instance instance, struct timeval *sample_time, double offset, NTP_Leap leap_status)
{
extern void RCL_SetDriverData(RCL_Instance instance, void *data);
extern void *RCL_GetDriverData(RCL_Instance instance);
extern char *RCL_GetDriverParameter(RCL_Instance instance);
+extern char *RCL_GetDriverOption(RCL_Instance instance, char *name);
extern int RCL_AddSample(RCL_Instance instance, struct timeval *sample_time, double offset, NTP_Leap leap_status);
extern int RCL_AddPulse(RCL_Instance instance, struct timeval *pulse_time, double second);
pps_params_t params;
struct pps_instance *pps;
int fd, edge_clear, mode;
- char *path, *s;
+ char *path;
path = RCL_GetDriverParameter(instance);
-
- edge_clear = 0;
- if ((s = strrchr(path, ':')) != NULL) {
- *s = '\0';
- edge_clear = atoi(s + 1);
- }
+ edge_clear = RCL_GetDriverOption(instance, "clear") ? 1 : 0;
fd = open(path, O_RDWR);
if (fd < 0) {