getPPSEventTimestamp reads the first PPS event from the sink file descriptor and returns the timestamp of the event
()
| 295 | } |
| 296 | |
| 297 | // getPPSEventTimestamp reads the first PPS event from the sink file descriptor and returns the timestamp of the event |
| 298 | func (ppsSink *PPSSink) getPPSEventTimestamp() (time.Time, error) { |
| 299 | var event PtpExttsEvent |
| 300 | buf := make([]byte, binary.Size(event)) |
| 301 | _, err := ppsSink.Device.Read(buf) |
| 302 | if err != nil { |
| 303 | return time.Time{}, fmt.Errorf("error reading from sink %v: %w", ppsSink.Device.File().Name(), err) |
| 304 | } |
| 305 | event = *(*PtpExttsEvent)(unsafe.Pointer(&buf[0])) // urgh... |
| 306 | if uint(event.Index) != ppsSink.InputPin { |
| 307 | return time.Time{}, fmt.Errorf("extts on unexpected pin index %d, expected %d", event.Index, ppsSink.InputPin) |
| 308 | } |
| 309 | |
| 310 | t := event.T |
| 311 | eventTime := time.Unix(t.Sec, int64(t.Nsec)) |
| 312 | |
| 313 | return eventTime, nil |
| 314 | } |
| 315 | |
| 316 | // pollFd polls the file descriptor for an event, and returns the number of events, the file descriptor, and error |