func()

in ptp/simpleclient/measurements.go [100:138]


func (m *measurements) latest() (*MeasurementResult, error) {
	var lastServerToClient *mData
	var lastClientToServer *mData
	for _, v := range m.serverToClient {
		if v.receiveTS.IsZero() || v.sendTS.IsZero() {
			continue
		}
		if lastServerToClient == nil || v.receiveTS.After(lastServerToClient.receiveTS) {
			lastServerToClient = v
		}
	}
	for _, v := range m.clientToServer {
		if v.receiveTS.IsZero() || v.sendTS.IsZero() {
			continue
		}
		if lastClientToServer == nil || v.receiveTS.After(lastClientToServer.receiveTS) {
			lastClientToServer = v
		}
	}
	if lastServerToClient == nil {
		return nil, fmt.Errorf("no sync/followup data yet")
	}
	if lastClientToServer == nil {
		return nil, fmt.Errorf("no delay data yet")
	}
	clientToServerDiff := lastClientToServer.receiveTS.Sub(lastClientToServer.sendTS)
	serverToClientDiff := lastServerToClient.receiveTS.Sub(lastServerToClient.sendTS)
	delay := (clientToServerDiff + serverToClientDiff) / 2
	offset := serverToClientDiff - delay
	// or this expression of same formula
	// offset := (serverToClientDiff - clientToServerDiff)/2
	return &MeasurementResult{
		Delay:              delay,
		Offset:             offset,
		ServerToClientDiff: serverToClientDiff,
		ClientToServerDiff: clientToServerDiff,
		Timestamp:          lastClientToServer.receiveTS,
	}, nil
}