Browse Source

HAL_SITL: added millis64() and micros64()

mission-4.1.18
Andrew Tridgell 11 years ago
parent
commit
5a55101703
  1. 44
      libraries/AP_HAL_AVR_SITL/Scheduler.cpp
  2. 4
      libraries/AP_HAL_AVR_SITL/Scheduler.h
  3. 2
      libraries/AP_HAL_AVR_SITL/sitl_ins.cpp

44
libraries/AP_HAL_AVR_SITL/Scheduler.cpp

@ -70,52 +70,64 @@ double SITLScheduler::_cyg_sec()
} }
#endif #endif
uint32_t SITLScheduler::_micros() uint64_t SITLScheduler::_micros64()
{ {
#ifdef __CYGWIN__ #ifdef __CYGWIN__
return (uint32_t)(_cyg_sec() * 1.0e6); return (uint64_t)(_cyg_sec() * 1.0e6);
#else #else
struct timeval tp; struct timeval tp;
gettimeofday(&tp,NULL); gettimeofday(&tp,NULL);
return 1.0e6*((tp.tv_sec + (tp.tv_usec*1.0e-6)) - uint64_t ret = 1.0e6*((tp.tv_sec + (tp.tv_usec*1.0e-6)) -
(_sketch_start_time.tv_sec + (_sketch_start_time.tv_sec +
(_sketch_start_time.tv_usec*1.0e-6))); (_sketch_start_time.tv_usec*1.0e-6)));
return ret;
#endif #endif
} }
uint64_t SITLScheduler::micros64()
{
return _micros64();
}
uint32_t SITLScheduler::micros() uint32_t SITLScheduler::micros()
{ {
return _micros(); return micros64() & 0xFFFFFFFF;
} }
uint32_t SITLScheduler::millis() uint64_t SITLScheduler::millis64()
{ {
#ifdef __CYGWIN__ #ifdef __CYGWIN__
// 1000 ms in a second // 1000 ms in a second
return (uint32_t)(_cyg_sec() * 1000); return (uint64_t)(_cyg_sec() * 1000);
#else #else
struct timeval tp; struct timeval tp;
gettimeofday(&tp,NULL); gettimeofday(&tp,NULL);
return 1.0e3*((tp.tv_sec + (tp.tv_usec*1.0e-6)) - uint64_t ret = 1.0e3*((tp.tv_sec + (tp.tv_usec*1.0e-6)) -
(_sketch_start_time.tv_sec + (_sketch_start_time.tv_sec +
(_sketch_start_time.tv_usec*1.0e-6))); (_sketch_start_time.tv_usec*1.0e-6)));
return ret;
#endif #endif
} }
uint32_t SITLScheduler::millis()
{
return millis64() & 0xFFFFFFFF;
}
void SITLScheduler::delay_microseconds(uint16_t usec) void SITLScheduler::delay_microseconds(uint16_t usec)
{ {
uint32_t start = micros(); uint64_t start = micros64();
while (micros() - start < usec) { while (micros64() - start < usec) {
usleep(usec - (micros() - start)); usleep(usec - (micros64() - start));
} }
} }
void SITLScheduler::delay(uint16_t ms) void SITLScheduler::delay(uint16_t ms)
{ {
uint32_t start = micros(); uint64_t start = micros64();
while (ms > 0) { while (ms > 0) {
while ((micros() - start) >= 1000) { while ((micros64() - start) >= 1000) {
ms--; ms--;
if (ms == 0) break; if (ms == 0) break;
start += 1000; start += 1000;

4
libraries/AP_HAL_AVR_SITL/Scheduler.h

@ -19,6 +19,8 @@ public:
void delay(uint16_t ms); void delay(uint16_t ms);
uint32_t millis(); uint32_t millis();
uint32_t micros(); uint32_t micros();
uint64_t millis64();
uint64_t micros64();
void delay_microseconds(uint16_t us); void delay_microseconds(uint16_t us);
void register_delay_callback(AP_HAL::Proc, uint16_t min_time_ms); void register_delay_callback(AP_HAL::Proc, uint16_t min_time_ms);
@ -43,7 +45,7 @@ public:
void sitl_end_atomic(); void sitl_end_atomic();
// callable from interrupt handler // callable from interrupt handler
static uint32_t _micros(); static uint64_t _micros64();
static void timer_event() { _run_timer_procs(true); _run_io_procs(true); } static void timer_event() { _run_timer_procs(true); _run_io_procs(true); }
private: private:

2
libraries/AP_HAL_AVR_SITL/sitl_ins.cpp

@ -52,7 +52,7 @@ float SITL_State::_gyro_drift(void)
return 0; return 0;
} }
double period = _sitl->drift_time * 2; double period = _sitl->drift_time * 2;
double minutes = fmod(_scheduler->_micros() / 60.0e6, period); double minutes = fmod(_scheduler->_micros64() / 60.0e6, period);
if (minutes < period/2) { if (minutes < period/2) {
return minutes * ToRad(_sitl->drift_speed); return minutes * ToRad(_sitl->drift_speed);
} }

Loading…
Cancel
Save