You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
2.7 KiB
147 lines
2.7 KiB
/* |
|
(c) 2017 night_ghost@ykoctpa.ru |
|
|
|
*/ |
|
|
|
#pragma GCC optimize ("O2") |
|
|
|
#include <stdarg.h> |
|
#include <stdio.h> |
|
|
|
#include <AP_HAL/AP_HAL.h> |
|
#include <AP_HAL/system.h> |
|
|
|
#include "Scheduler.h" |
|
#include <AP_Param_Helper/AP_Param_Helper.h> |
|
|
|
extern const AP_HAL::HAL& hal; |
|
|
|
using namespace F4Light; |
|
|
|
|
|
namespace AP_HAL { |
|
|
|
void cond_yield(); |
|
|
|
void init() // early init on creation of HAL class |
|
{ |
|
} |
|
|
|
void panic(const char *errormsg, ...) |
|
{ |
|
va_list ap; |
|
|
|
if(boardEmergencyHandler) boardEmergencyHandler(); // call emergency handler before |
|
|
|
va_start(ap, errormsg); |
|
hal.console->vprintf(errormsg, ap); |
|
va_end(ap); |
|
hal.console->printf("\n"); |
|
|
|
if(is_bare_metal() || hal_param_helper->_boot_dfu) { // bare metal build without bootloader should reboot to DFU after any fault |
|
board_set_rtc_register(DFU_RTC_SIGNATURE, RTC_SIGNATURE_REG); |
|
} else { |
|
board_set_rtc_register(BOOT_RTC_SIGNATURE, RTC_SIGNATURE_REG); |
|
} |
|
|
|
error_throb(0); |
|
} |
|
|
|
void cond_yield(){ |
|
static uint32_t last_yield=0; |
|
|
|
uint32_t t=F4Light::Scheduler::_micros(); |
|
if(t-last_yield>300 || last_yield==t) { // if yield was long ago or mills() called too often |
|
F4Light::Scheduler::yield(0); |
|
} |
|
|
|
last_yield=F4Light::Scheduler::_micros(); |
|
} |
|
|
|
|
|
uint32_t millis(){ |
|
cond_yield(); |
|
return F4Light::Scheduler::_millis(); |
|
} |
|
|
|
|
|
uint64_t millis64(){ |
|
cond_yield(); // to prevent CPU eating by wait loops |
|
return F4Light::Scheduler::_millis64(); |
|
} |
|
|
|
uint32_t micros() { |
|
return F4Light::Scheduler::_micros(); |
|
} |
|
|
|
uint64_t micros64(){ |
|
return F4Light::Scheduler::_micros64(); |
|
} |
|
|
|
// revo internals |
|
|
|
void delay(uint32_t ms); |
|
void delay_microseconds(uint16_t us); |
|
void yield(uint32_t us); |
|
|
|
void delay(uint32_t ms){ |
|
F4Light::Scheduler::_delay(ms); |
|
} |
|
|
|
void delay_microseconds(uint16_t us) { |
|
F4Light::Scheduler::_delay_microseconds(us); |
|
} |
|
|
|
void yield(uint32_t us){ |
|
F4Light::Scheduler::yield(us); |
|
} |
|
|
|
|
|
} // namespace AP_HAL |
|
|
|
|
|
// export console IO to low-level functions |
|
// so any printf will go to console, not to /dev/null |
|
extern "C" { |
|
unsigned char getch(void); |
|
|
|
int _read(int fd, char *buf, size_t cnt); |
|
|
|
void putch(unsigned char c); |
|
|
|
extern int printf(const char *msg, ...); |
|
} |
|
|
|
|
|
unsigned char getch(void) { |
|
if(hal.console->available()) |
|
return hal.console->read(); |
|
return 0; |
|
} |
|
|
|
int _read(int fd, char *buf, size_t cnt) { |
|
uint16_t rcv=0; |
|
|
|
while(cnt--){ |
|
if(hal.console->available()){ |
|
*buf++ = hal.console->read(); |
|
rcv++; |
|
} else break; |
|
} |
|
|
|
return rcv; |
|
} |
|
|
|
void putch(unsigned char c) { |
|
hal.console->write(c); |
|
} |
|
|
|
int printf(const char *msg, ...){ |
|
va_list ap; |
|
|
|
va_start(ap, msg); |
|
hal.console->vprintf(msg, ap); |
|
va_end(ap); |
|
return 1; |
|
} |
|
|
|
|