HAL_Linux: implement uart timestamp API
This commit is contained in:
parent
f4f62ececa
commit
b8eeac41c8
@ -87,6 +87,8 @@ void UARTDriver::begin(uint32_t b, uint16_t rxS, uint16_t txS)
|
||||
|
||||
_device->set_speed(b);
|
||||
|
||||
_baudrate = b;
|
||||
|
||||
_allocate_buffers(rxS, txS);
|
||||
}
|
||||
|
||||
@ -471,6 +473,10 @@ void UARTDriver::_timer_tick(void)
|
||||
}
|
||||
_readbuf.commit((unsigned)ret);
|
||||
|
||||
// update receive timestamp
|
||||
_receive_timestamp[_receive_timestamp_idx^1] = AP_HAL::micros64();
|
||||
_receive_timestamp_idx ^= 1;
|
||||
|
||||
/* stop reading as we read less than we asked for */
|
||||
if ((unsigned)ret < vec[i].len) {
|
||||
break;
|
||||
@ -479,3 +485,27 @@ void UARTDriver::_timer_tick(void)
|
||||
|
||||
_in_timer = false;
|
||||
}
|
||||
|
||||
/*
|
||||
return timestamp estimate in microseconds for when the start of
|
||||
a nbytes packet arrived on the uart. This should be treated as a
|
||||
time constraint, not an exact time. It is guaranteed that the
|
||||
packet did not start being received after this time, but it
|
||||
could have been in a system buffer before the returned time.
|
||||
|
||||
This takes account of the baudrate of the link. For transports
|
||||
that have no baudrate (such as USB) the time estimate may be
|
||||
less accurate.
|
||||
|
||||
A return value of zero means the HAL does not support this API
|
||||
*/
|
||||
uint64_t UARTDriver::receive_time_constraint_us(uint16_t nbytes) const
|
||||
{
|
||||
uint64_t last_receive_us = _receive_timestamp[_receive_timestamp_idx];
|
||||
if (_baudrate > 0) {
|
||||
// assume 10 bits per byte.
|
||||
uint32_t transport_time_us = (1000000UL * 10UL / _baudrate) * nbytes;
|
||||
last_receive_us -= transport_time_us;
|
||||
}
|
||||
return last_receive_us;
|
||||
}
|
||||
|
@ -49,12 +49,28 @@ public:
|
||||
_device->set_flow_control(flow_control_setting);
|
||||
}
|
||||
|
||||
/*
|
||||
return timestamp estimate in microseconds for when the start of
|
||||
a nbytes packet arrived on the uart. This should be treated as a
|
||||
time constraint, not an exact time. It is guaranteed that the
|
||||
packet did not start being received after this time, but it
|
||||
could have been in a system buffer before the returned time.
|
||||
|
||||
This takes account of the baudrate of the link. For transports
|
||||
that have no baudrate (such as USB) the time estimate may be
|
||||
less accurate.
|
||||
|
||||
A return value of zero means the HAL does not support this API
|
||||
*/
|
||||
uint64_t receive_time_constraint_us(uint16_t nbytes) const override;
|
||||
|
||||
private:
|
||||
AP_HAL::OwnPtr<SerialDevice> _device;
|
||||
bool _nonblocking_writes;
|
||||
bool _console;
|
||||
volatile bool _in_timer;
|
||||
uint16_t _base_port;
|
||||
uint32_t _baudrate;
|
||||
char *_ip;
|
||||
char *_flag;
|
||||
bool _connected; // true if a client has connected
|
||||
@ -66,6 +82,10 @@ private:
|
||||
AP_HAL::OwnPtr<SerialDevice> _parseDevicePath(const char *arg);
|
||||
uint64_t _last_write_time;
|
||||
|
||||
// timestamp for receiving data on the UART, avoiding a lock
|
||||
uint64_t _receive_timestamp[2];
|
||||
uint8_t _receive_timestamp_idx;
|
||||
|
||||
protected:
|
||||
const char *device_path;
|
||||
volatile bool _initialised;
|
||||
|
Loading…
Reference in New Issue
Block a user