diff --git a/Tools/sitl_run.sh b/Tools/sitl_run.sh index dcfd21930b..a30897fe7a 100755 --- a/Tools/sitl_run.sh +++ b/Tools/sitl_run.sh @@ -14,6 +14,15 @@ echo program: $program echo model: $model echo build_path: $build_path +if [ "$chroot" == "1" ] +then + chroot_enabled=-c + sudo_enabled=sudo +else + chroot_enabled="" + sudo_enabled="" +fi + if [ "$model" == "" ] || [ "$model" == "none" ] then echo "empty model, setting iris as default" @@ -48,7 +57,7 @@ if [ "$program" == "jmavsim" ] && [ "$no_sim" == "" ] then cd Tools/jMAVSim ant - nice -n -10 java -Djava.ext.dirs= -cp lib/*:out/production/jmavsim.jar me.drton.jmavsim.Simulator -udp 127.0.0.1:14560 & + java -Djava.ext.dirs= -cp lib/*:out/production/jmavsim.jar me.drton.jmavsim.Simulator -udp 127.0.0.1:14560 & SIM_PID=`echo $!` elif [ "$program" == "gazebo" ] && [ "$no_sim" == "" ] then @@ -65,7 +74,7 @@ then cd Tools/sitl_gazebo/Build cmake -Wno-dev .. make -j4 - nice -n -10 gzserver --verbose ../worlds/${model}.world & + gzserver --verbose ../worlds/${model}.world & SIM_PID=`echo $!` gzclient --verbose & GUI_PID=`echo $!` @@ -96,7 +105,7 @@ elif [ "$debugger" == "valgrind" ] then valgrind ./mainapp ../../../../${rc_script}_${program}_${model} else - nice -n -10 ./mainapp ../../../../${rc_script}_${program}_${model} + $sudo_enabled ./mainapp $chroot_enabled ../../../../${rc_script}_${program}_${model} fi if [ "$program" == "jmavsim" ] diff --git a/cmake/configs/nuttx_px4fmu-v4_default.cmake b/cmake/configs/nuttx_px4fmu-v4_default.cmake index 98582ede2d..9d22c71bbf 100644 --- a/cmake/configs/nuttx_px4fmu-v4_default.cmake +++ b/cmake/configs/nuttx_px4fmu-v4_default.cmake @@ -144,7 +144,7 @@ set(config_module_list #examples/math_demo # Tutorial code from # https://px4.io/dev/px4_simple_app - #examples/px4_simple_app + examples/px4_simple_app # Tutorial code from # https://px4.io/dev/daemon diff --git a/cmake/configs/posix_sitl_default.cmake b/cmake/configs/posix_sitl_default.cmake index b3c9205586..4f4be42ab2 100644 --- a/cmake/configs/posix_sitl_default.cmake +++ b/cmake/configs/posix_sitl_default.cmake @@ -59,6 +59,7 @@ set(config_module_list lib/launchdetection lib/terrain_estimation lib/runway_takeoff + examples/px4_simple_app ) set(config_extra_builtin_cmds diff --git a/src/drivers/boards/aerocore/board_config.h b/src/drivers/boards/aerocore/board_config.h index 155173db5f..d6932c713d 100644 --- a/src/drivers/boards/aerocore/board_config.h +++ b/src/drivers/boards/aerocore/board_config.h @@ -150,6 +150,7 @@ __BEGIN_DECLS #define GPIO_TIM3_CH2OUT GPIO_TIM3_CH2OUT_3 #define GPIO_TIM3_CH3OUT GPIO_TIM3_CH3OUT_2 #define GPIO_TIM3_CH4OUT GPIO_TIM3_CH4OUT_2 +#define DIRECT_PWM_OUTPUT_CHANNELS 8 /* High-resolution timer */ #define HRT_TIMER 8 /* use timer 8 for the HRT */ diff --git a/src/drivers/boards/px4fmu-v1/board_config.h b/src/drivers/boards/px4fmu-v1/board_config.h index 5957ce6fc5..2c14788ee6 100644 --- a/src/drivers/boards/px4fmu-v1/board_config.h +++ b/src/drivers/boards/px4fmu-v1/board_config.h @@ -182,6 +182,7 @@ __BEGIN_DECLS #define GPIO_TIM2_CH2OUT GPIO_TIM2_CH2OUT_1 #define GPIO_TIM2_CH3OUT GPIO_TIM2_CH3OUT_1 #define GPIO_TIM2_CH4OUT GPIO_TIM2_CH4OUT_1 +#define DIRECT_PWM_OUTPUT_CHANNELS 4 /* USB OTG FS * diff --git a/src/drivers/boards/px4fmu-v2/board_config.h b/src/drivers/boards/px4fmu-v2/board_config.h index ea60df9100..12593937f7 100644 --- a/src/drivers/boards/px4fmu-v2/board_config.h +++ b/src/drivers/boards/px4fmu-v2/board_config.h @@ -210,6 +210,7 @@ __BEGIN_DECLS #define GPIO_TIM1_CH4OUT GPIO_TIM1_CH4OUT_2 #define GPIO_TIM4_CH2OUT GPIO_TIM4_CH2OUT_2 #define GPIO_TIM4_CH3OUT GPIO_TIM4_CH3OUT_2 +#define DIRECT_PWM_OUTPUT_CHANNELS 6 /* USB OTG FS * diff --git a/src/drivers/boards/px4fmu-v4/board_config.h b/src/drivers/boards/px4fmu-v4/board_config.h index a29c961f5a..d57396a8fd 100644 --- a/src/drivers/boards/px4fmu-v4/board_config.h +++ b/src/drivers/boards/px4fmu-v4/board_config.h @@ -65,7 +65,7 @@ __BEGIN_DECLS //{0, GPIO_PERIPH_3V3_EN, 0}, Owned by the 8266 driver //{0, GPIO_SBUS_INV, 0}, https://github.com/PX4/Firmware/blob/master/src/modules/px4iofirmware/sbus.c //{GPIO_8266_GPIO0, 0, 0}, Owned by the 8266 driver -//{0, GPIO_SPEKTRUM_POWER, 0}, Owned Spektum driver input to auto pilot +//{0, GPIO_SPEKTRUM_PWR_EN, 0}, Owned Spektum driver input to auto pilot //{0, GPIO_8266_PD, 0}, Owned by the 8266 driver //{0, GPIO_8266_RST, 0}, Owned by the 8266 driver @@ -200,6 +200,7 @@ __BEGIN_DECLS #define GPIO_TIM1_CH4OUT GPIO_TIM1_CH4OUT_2 #define GPIO_TIM4_CH2OUT GPIO_TIM4_CH2OUT_2 #define GPIO_TIM4_CH3OUT GPIO_TIM4_CH3OUT_2 +#define DIRECT_PWM_OUTPUT_CHANNELS 6 /* USB OTG FS * @@ -223,15 +224,23 @@ __BEGIN_DECLS #define GPIO_RSSI_IN (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN1) #define GPIO_LED_SAFETY (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN3) -#define GPIO_SAFETY_SWITCH_IN (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN4) +#define GPIO_BTN_SAFETY (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTC|GPIO_PIN4) #define GPIO_PERIPH_3V3_EN (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN5) #define GPIO_SBUS_INV (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTC|GPIO_PIN13) #define GPIO_8266_GPIO0 (GPIO_INPUT|GPIO_PULLUP|GPIO_PORTE|GPIO_PIN2) -#define GPIO_SPEKTRUM_POWER (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN4) +#define GPIO_SPEKTRUM_PWR_EN (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTE|GPIO_PIN4) #define GPIO_8266_PD (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN5) #define GPIO_8266_RST (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTE|GPIO_PIN6) +/* Power switch controls ******************************************************/ + +#define POWER_SPEKTRUM(_s) stm32_gpiowrite(GPIO_SPEKTRUM_PWR_EN, (_s)) +#define GPIO_USART1_RX_SPEKTRUM (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_2MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN7) +#define SPEKTRUM_RX_HIGH(_s) stm32_gpiowrite(GPIO_USART1_RX_SPEKTRUM, (_s)) +#define SPEKTRUM_RX_AS_UART() stm32_configgpio(GPIO_USART1_RX) +#define SPEKTRUM_RX_AS_GPIO() stm32_configgpio(GPIO_USART1_RX_SPEKTRUM) + /**************************************************************************************************** * Public Types ****************************************************************************************************/ diff --git a/src/drivers/boards/px4fmu-v4/px4fmu_init.c b/src/drivers/boards/px4fmu-v4/px4fmu_init.c index 7966f57165..d093e47bf4 100644 --- a/src/drivers/boards/px4fmu-v4/px4fmu_init.c +++ b/src/drivers/boards/px4fmu-v4/px4fmu_init.c @@ -230,7 +230,7 @@ __EXPORT int nsh_archinitialize(void) stm32_configgpio(GPIO_SBUS_INV); stm32_configgpio(GPIO_8266_GPIO0); - stm32_configgpio(GPIO_SPEKTRUM_POWER); + stm32_configgpio(GPIO_SPEKTRUM_PWR_EN); stm32_configgpio(GPIO_8266_PD); stm32_configgpio(GPIO_8266_RST); diff --git a/src/drivers/boards/px4io-v1/board_config.h b/src/drivers/boards/px4io-v1/board_config.h index f83f18e503..6475d717d8 100644 --- a/src/drivers/boards/px4io-v1/board_config.h +++ b/src/drivers/boards/px4io-v1/board_config.h @@ -83,6 +83,13 @@ #define GPIO_RELAY1_EN (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN12) #define GPIO_RELAY2_EN (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_CLEAR|GPIO_PORTA|GPIO_PIN11) +#define GPIO_SPEKTRUM_PWR_EN GPIO_RELAY1_EN +#define POWER_SPEKTRUM(_s) stm32_gpiowrite(GPIO_RELAY1_EN, (_s)) + +#define SPEKTRUM_RX_HIGH(_s) stm32_gpiowrite(GPIO_USART1_RX_SPEKTRUM, (_s)) +#define SPEKTRUM_RX_AS_UART() stm32_configgpio(GPIO_USART1_RX) +#define SPEKTRUM_RX_AS_GPIO() stm32_configgpio(GPIO_USART1_RX_SPEKTRUM) + /* Analog inputs ********************************************************************/ #define GPIO_ADC_VBATT (GPIO_INPUT|GPIO_CNF_ANALOGIN|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN4) diff --git a/src/drivers/boards/px4io-v2/board_config.h b/src/drivers/boards/px4io-v2/board_config.h index d97f3b203c..c54cf7b6f6 100644 --- a/src/drivers/boards/px4io-v2/board_config.h +++ b/src/drivers/boards/px4io-v2/board_config.h @@ -79,7 +79,7 @@ #define GPIO_LED3 (GPIO_OUTPUT|GPIO_CNF_OUTOD|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN13) #define GPIO_LED4 (GPIO_OUTPUT|GPIO_CNF_OUTOD|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN11) -#define GPIO_USART1_RX_SPEKTRUM (GPIO_OUTPUT | GPIO_CNF_OUTPP | GPIO_MODE_50MHz | GPIO_OUTPUT_SET | GPIO_PORTA | GPIO_PIN10) +#define GPIO_USART1_RX_SPEKTRUM (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTA|GPIO_PIN10) /* Safety switch button *******************************************************/ @@ -88,6 +88,11 @@ /* Power switch controls ******************************************************/ #define GPIO_SPEKTRUM_PWR_EN (GPIO_OUTPUT|GPIO_CNF_OUTPP|GPIO_MODE_50MHz|GPIO_OUTPUT_SET|GPIO_PORTC|GPIO_PIN13) +#define POWER_SPEKTRUM(_s) stm32_gpiowrite(GPIO_SPEKTRUM_PWR_EN, (_s)) + +#define SPEKTRUM_RX_HIGH(_s) stm32_gpiowrite(GPIO_USART1_RX_SPEKTRUM, (_s)) +#define SPEKTRUM_RX_AS_UART() stm32_configgpio(GPIO_USART1_RX) +#define SPEKTRUM_RX_AS_GPIO() stm32_configgpio(GPIO_USART1_RX_SPEKTRUM) #define GPIO_SERVO_FAULT_DETECT (GPIO_INPUT|GPIO_CNF_INPULLUP|GPIO_MODE_INPUT|GPIO_PORTA|GPIO_PIN15) diff --git a/src/drivers/px4fmu/fmu.cpp b/src/drivers/px4fmu/fmu.cpp index 8892cfedeb..00b9f81f25 100644 --- a/src/drivers/px4fmu/fmu.cpp +++ b/src/drivers/px4fmu/fmu.cpp @@ -90,12 +90,8 @@ # include #endif -/* - * This is the analog to FMU_INPUT_DROP_LIMIT_US on the IO side - */ - -#define CONTROL_INPUT_DROP_LIMIT_US 2000 -#define NAN_VALUE (0.0f/0.0f) +#define SCHEDULE_INTERVAL 2000 /**< The schedule interval in usec (500 Hz) */ +#define NAN_VALUE (0.0f/0.0f) /**< NaN value for throttle lock mode */ class PX4FMU : public device::CDev { @@ -123,15 +119,7 @@ public: int set_i2c_bus_clock(unsigned bus, unsigned clock_hz); private: -#if defined(CONFIG_ARCH_BOARD_PX4FMU_V1) - static const unsigned _max_actuators = 4; -#endif -#if defined(CONFIG_ARCH_BOARD_PX4FMU_V2) || defined(CONFIG_ARCH_BOARD_PX4FMU_V4) - static const unsigned _max_actuators = 6; -#endif -#if defined(CONFIG_ARCH_BOARD_AEROCORE) - static const unsigned _max_actuators = 8; -#endif + static const unsigned _max_actuators = DIRECT_PWM_OUTPUT_CHANNELS; Mode _mode; unsigned _pwm_default_rate; @@ -189,7 +177,7 @@ private: int set_pwm_rate(unsigned rate_map, unsigned default_rate, unsigned alt_rate); int pwm_ioctl(file *filp, int cmd, unsigned long arg); void update_pwm_rev_mask(); - void publish_pwm_outputs(uint16_t *values, size_t numvalues); + void publish_pwm_outputs(uint16_t *values, size_t numvalues); struct GPIOConfig { uint32_t input; @@ -321,11 +309,9 @@ PX4FMU::PX4FMU() : memset(_controls, 0, sizeof(_controls)); memset(_poll_fds, 0, sizeof(_poll_fds)); -#ifdef HRT_PPM_CHANNEL // rc input, published to ORB memset(&_rc_in, 0, sizeof(_rc_in)); _rc_in.input_source = input_rc_s::RC_INPUT_SOURCE_PX4FMU_PPM; -#endif #ifdef GPIO_SBUS_INV // this board has a GPIO to control SBUS inversion @@ -728,8 +714,8 @@ PX4FMU::cycle() //main_out_latency = hrt_absolute_time() - _controls[i].timestamp - 250; /* do only correct within the current phase */ - if (abs(main_out_latency) > CONTROL_INPUT_DROP_LIMIT_US) { - main_out_latency = CONTROL_INPUT_DROP_LIMIT_US; + if (abs(main_out_latency) > SCHEDULE_INTERVAL) { + main_out_latency = SCHEDULE_INTERVAL; } if (main_out_latency < 250) { @@ -905,7 +891,7 @@ PX4FMU::cycle() } work_queue(HPWORK, &_work, (worker_t)&PX4FMU::cycle_trampoline, this, - USEC2TICK(CONTROL_INPUT_DROP_LIMIT_US - main_out_latency)); + USEC2TICK(SCHEDULE_INTERVAL - main_out_latency)); } void PX4FMU::work_stop() @@ -1683,9 +1669,9 @@ PX4FMU::peripheral_reset(int ms) stm32_gpiowrite(GPIO_PERIPH_3V3_EN, 0); - bool last = stm32_gpioread(GPIO_SPEKTRUM_POWER); + bool last = stm32_gpioread(GPIO_SPEKTRUM_PWR_EN); /* Keep Spektum on to discharge rail*/ - stm32_gpiowrite(GPIO_SPEKTRUM_POWER, 1); + stm32_gpiowrite(GPIO_SPEKTRUM_PWR_EN, 1); /* wait for the peripheral rail to reach GND */ usleep(ms * 1000); @@ -1694,7 +1680,7 @@ PX4FMU::peripheral_reset(int ms) /* re-enable power */ /* switch the peripheral rail back on */ - stm32_gpiowrite(GPIO_SPEKTRUM_POWER, last); + stm32_gpiowrite(GPIO_SPEKTRUM_PWR_EN, last); stm32_gpiowrite(GPIO_PERIPH_3V3_EN, 1); #endif } diff --git a/src/examples/px4_simple_app/px4_simple_app.c b/src/examples/px4_simple_app/px4_simple_app.c index ea54574bb9..23cd124130 100644 --- a/src/examples/px4_simple_app/px4_simple_app.c +++ b/src/examples/px4_simple_app/px4_simple_app.c @@ -39,6 +39,8 @@ */ #include +#include +#include #include #include #include @@ -52,7 +54,7 @@ __EXPORT int px4_simple_app_main(int argc, char *argv[]); int px4_simple_app_main(int argc, char *argv[]) { - printf("Hello Sky!\n"); + PX4_INFO("Hello Sky!"); /* subscribe to sensor_combined topic */ int sensor_sub_fd = orb_subscribe(ORB_ID(sensor_combined)); @@ -64,7 +66,7 @@ int px4_simple_app_main(int argc, char *argv[]) orb_advert_t att_pub = orb_advertise(ORB_ID(vehicle_attitude), &att); /* one could wait for multiple topics with this technique, just using one here */ - struct pollfd fds[] = { + px4_pollfd_struct_t fds[] = { { .fd = sensor_sub_fd, .events = POLLIN }, /* there could be more file descriptors here, in the form like: * { .fd = other_sub_fd, .events = POLLIN }, @@ -75,19 +77,19 @@ int px4_simple_app_main(int argc, char *argv[]) for (int i = 0; i < 5; i++) { /* wait for sensor update of 1 file descriptor for 1000 ms (1 second) */ - int poll_ret = poll(fds, 1, 1000); + int poll_ret = px4_poll(fds, 1, 1000); /* handle the poll result */ if (poll_ret == 0) { /* this means none of our providers is giving us data */ - printf("[px4_simple_app] Got no data within a second\n"); + PX4_ERR("[px4_simple_app] Got no data within a second"); } else if (poll_ret < 0) { /* this is seriously bad - should be an emergency */ if (error_counter < 10 || error_counter % 50 == 0) { /* use a counter to prevent flooding (and slowing us down) */ - printf("[px4_simple_app] ERROR return value from poll(): %d\n" - , poll_ret); + PX4_ERR("[px4_simple_app] ERROR return value from poll(): %d" + , poll_ret); } error_counter++; @@ -99,10 +101,10 @@ int px4_simple_app_main(int argc, char *argv[]) struct sensor_combined_s raw; /* copy sensors raw data into local buffer */ orb_copy(ORB_ID(sensor_combined), sensor_sub_fd, &raw); - printf("[px4_simple_app] Accelerometer:\t%8.4f\t%8.4f\t%8.4f\n", - (double)raw.accelerometer_m_s2[0], - (double)raw.accelerometer_m_s2[1], - (double)raw.accelerometer_m_s2[2]); + PX4_WARN("[px4_simple_app] Accelerometer:\t%8.4f\t%8.4f\t%8.4f", + (double)raw.accelerometer_m_s2[0], + (double)raw.accelerometer_m_s2[1], + (double)raw.accelerometer_m_s2[2]); /* set att and publish this information for other apps */ att.roll = raw.accelerometer_m_s2[0]; @@ -117,5 +119,7 @@ int px4_simple_app_main(int argc, char *argv[]) } } + PX4_INFO("exiting"); + return 0; } diff --git a/src/lib/rc/dsm.c b/src/lib/rc/dsm.c index 5d7186ec1b..22aeeddb63 100644 --- a/src/lib/rc/dsm.c +++ b/src/lib/rc/dsm.c @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2012-2014 PX4 Development Team. All rights reserved. + * Copyright (c) 2012-2015 PX4 Development Team. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -40,7 +40,8 @@ */ #include -#include +#include +#include #include #include @@ -49,27 +50,32 @@ #include "dsm.h" #include -#ifdef CONFIG_ARCH_BOARD_PX4IO_V1 -#include +#if defined (__PX4_LINUX) || defined (__PX4_DARWIN) +#define dsm_udelay(arg) usleep(arg) +#else +#include +#define dsm_udelay(arg) up_udelay(arg) #endif -#ifdef CONFIG_ARCH_BOARD_PX4IO_V2 -#include -#endif +//#define DSM_DEBUG -#define DSM_FRAME_SIZE 16 /**= 0) { @@ -247,17 +257,43 @@ dsm_init(const char *device) /* reset the format detector */ dsm_guess_format(true); - //debug("DSM: ready"); - - } else { - - //debug("DSM: open failed"); - + ret = 0; } - return dsm_fd; + return ret; } +/** + * Initialize the DSM receive functionality + * + * Open the UART for receiving DSM frames and configure it appropriately + * + * @param[in] device Device name of DSM UART + */ +int +dsm_init(const char *device) +{ + + if (dsm_fd < 0) { + dsm_fd = open(device, O_RDONLY | O_NONBLOCK); + } + + dsm_channel_shift = 0; + dsm_frame_drops = 0; + dsm_chan_count = 0; + dsm_decode_state = DSM_DECODE_STATE_DESYNC; + + int ret = dsm_config(dsm_fd); + + if (!ret) { + return dsm_fd; + + } else { + return -1; + } +} + +#ifdef GPIO_SPEKTRUM_PWR_EN /** * Handle DSM satellite receiver bind mode handler * @@ -267,64 +303,52 @@ dsm_init(const char *device) void dsm_bind(uint16_t cmd, int pulses) { -#if !defined(GPIO_USART1_RX_SPEKTRUM) -#else - if (dsm_fd < 0) { return; } switch (cmd) { - case dsm_bind_power_down: + case DSM_CMD_BIND_POWER_DOWN: /*power down DSM satellite*/ -#if defined(CONFIG_ARCH_BOARD_PX4IO_V1) - POWER_RELAY1(0); -#elif defined(CONFIG_ARCH_BOARD_PX4IO_V2) POWER_SPEKTRUM(0); -#endif break; - case dsm_bind_power_up: + case DSM_CMD_BIND_POWER_UP: /*power up DSM satellite*/ -#if defined(CONFIG_ARCH_BOARD_PX4IO_V1) - POWER_RELAY1(1); -#elif defined(CONFIG_ARCH_BOARD_PX4IO_V2) POWER_SPEKTRUM(1); -#endif dsm_guess_format(true); break; - case dsm_bind_set_rx_out: + case DSM_CMD_BIND_SET_RX_OUT: /*Set UART RX pin to active output mode*/ - stm32_configgpio(GPIO_USART1_RX_SPEKTRUM); + SPEKTRUM_RX_AS_GPIO(); break; - case dsm_bind_send_pulses: + case DSM_CMD_BIND_SEND_PULSES: /*Pulse RX pin a number of times*/ for (int i = 0; i < pulses; i++) { - up_udelay(120); - stm32_gpiowrite(GPIO_USART1_RX_SPEKTRUM, false); - up_udelay(120); - stm32_gpiowrite(GPIO_USART1_RX_SPEKTRUM, true); + dsm_udelay(120); + SPEKTRUM_RX_HIGH(false); + dsm_udelay(120); + SPEKTRUM_RX_HIGH(true); } break; - case dsm_bind_reinit_uart: + case DSM_CMD_BIND_REINIT_UART: /*Restore USART RX pin to RS232 receive mode*/ - stm32_configgpio(GPIO_USART1_RX); + SPEKTRUM_RX_AS_UART(); break; } - -#endif } +#endif /** * Decode the entire dsm frame (all contained channels) @@ -335,7 +359,7 @@ dsm_bind(uint16_t cmd, int pulses) * @return true=DSM frame successfully decoded, false=no update */ bool -dsm_decode(hrt_abstime frame_time, uint16_t *values, uint16_t *num_values, unsigned max_values) +dsm_decode(hrt_abstime frame_time, uint16_t *values, uint16_t *num_values, bool *dsm_11_bit, unsigned max_values) { /* debug("DSM dsm_frame %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x %02x%02x", @@ -350,13 +374,11 @@ dsm_decode(hrt_abstime frame_time, uint16_t *values, uint16_t *num_values, unsig dsm_guess_format(true); } - /* we have received something we think is a dsm_frame */ - dsm_last_frame_time = frame_time; - /* if we don't know the dsm_frame format, update the guessing state machine */ if (dsm_channel_shift == 0) { - dsm_guess_format(false); - return false; + if (!dsm_guess_format(false)) { + return false; + } } /* @@ -380,6 +402,12 @@ dsm_decode(hrt_abstime frame_time, uint16_t *values, uint16_t *num_values, unsig continue; } + /* reset bit guessing state machine if the channel index is out of bounds */ + if (channel > DSM_MAX_CHANNEL_COUNT) { + dsm_guess_format(true); + return false; + } + /* ignore channels out of range */ if (channel >= max_values) { continue; @@ -447,14 +475,32 @@ dsm_decode(hrt_abstime frame_time, uint16_t *values, uint16_t *num_values, unsig *num_values = 12; } - if (dsm_channel_shift == 11) { - /* Set the 11-bit data indicator */ - *num_values |= 0x8000; - } + /* Set the 11-bit data indicator */ + *dsm_11_bit = (dsm_channel_shift == 11); + + /* we have received something we think is a dsm_frame */ + dsm_last_frame_time = frame_time; /* * XXX Note that we may be in failsafe here; we need to work out how to detect that. */ + +#ifdef DSM_DEBUG + printf("PARSED PACKET\n"); +#endif + + /* check all values */ + for (unsigned i = 0; i < *num_values; i++) { + /* if the value is unrealistic, fail the parsing entirely */ + if (values[i] < 600 || values[i] > 2400) { +#ifdef DSM_DEBUG + printf("DSM: VALUE RANGE FAIL\n"); +#endif + dsm_chan_count = 0; + return false; + } + } + return true; } @@ -480,27 +526,35 @@ dsm_decode(hrt_abstime frame_time, uint16_t *values, uint16_t *num_values, unsig * @return true=decoded raw channel values updated, false=no update */ bool -dsm_input(uint16_t *values, uint16_t *num_values, uint8_t *n_bytes, uint8_t **bytes, unsigned max_values) +dsm_input(int dsm_fd, uint16_t *values, uint16_t *num_values, bool *dsm_11_bit, uint8_t *n_bytes, uint8_t **bytes, + unsigned max_values) { - ssize_t ret; + int ret = 1; hrt_abstime now; /* + * The S.BUS protocol doesn't provide reliable framing, + * so we detect frame boundaries by the inter-frame delay. + * + * The minimum frame spacing is 7ms; with 25 bytes at 100000bps + * frame transmission time is ~2ms. + * + * We expect to only be called when bytes arrive for processing, + * and if an interval of more than 3ms passes between calls, + * the first byte we read will be the first byte of a frame. + * + * In the case where byte(s) are dropped from a frame, this also + * provides a degree of protection. Of course, it would be better + * if we didn't drop bytes... */ now = hrt_absolute_time(); - if ((now - dsm_last_rx_time) > 5000) { - if (dsm_partial_frame_count > 0) { - dsm_frame_drops++; - dsm_partial_frame_count = 0; - } - } - /* * Fetch bytes, but no more than we would need to complete - * the current dsm frame. + * a complete frame. */ - ret = read(dsm_fd, &dsm_frame[dsm_partial_frame_count], DSM_FRAME_SIZE - dsm_partial_frame_count); + + ret = read(dsm_fd, &dsm_buf[0], sizeof(dsm_buf) / sizeof(dsm_buf[0])); /* if the read failed for any reason, just give up here */ if (ret < 1) { @@ -508,27 +562,113 @@ dsm_input(uint16_t *values, uint16_t *num_values, uint8_t *n_bytes, uint8_t **by } else { *n_bytes = ret; - *bytes = &dsm_frame[dsm_partial_frame_count]; + *bytes = &dsm_buf[0]; + } + + /* + * Try to decode something with what we got + */ + return dsm_parse(now, &dsm_buf[0], ret, values, num_values, dsm_11_bit, &dsm_frame_drops, max_values); +} + +bool +dsm_parse(uint64_t now, uint8_t *frame, unsigned len, uint16_t *values, + uint16_t *num_values, bool *dsm_11_bit, unsigned *frame_drops, uint16_t max_channels) +{ + + /* this is set by the decoding state machine and will default to false + * once everything that was decodable has been decoded. + */ + bool decode_ret = false; + + /* keep decoding until we have consumed the buffer */ + for (unsigned d = 0; d < len; d++) { + + /* overflow check */ + if (dsm_partial_frame_count == sizeof(dsm_frame) / sizeof(dsm_frame[0])) { + dsm_partial_frame_count = 0; + dsm_decode_state = DSM_DECODE_STATE_DESYNC; +#ifdef DSM_DEBUG + printf("DSM: RESET (BUF LIM)\n"); +#endif + } + + if (dsm_partial_frame_count == DSM_FRAME_SIZE) { + dsm_partial_frame_count = 0; + dsm_decode_state = DSM_DECODE_STATE_DESYNC; +#ifdef DSM_DEBUG + printf("DSM: RESET (PACKET LIM)\n"); +#endif + } + +#ifdef DSM_DEBUG +#if 1 + printf("dsm state: %s%s, count: %d, val: %02x\n", + (dsm_decode_state == DSM_DECODE_STATE_DESYNC) ? "DSM_DECODE_STATE_DESYNC" : "", + (dsm_decode_state == DSM_DECODE_STATE_SYNC) ? "DSM_DECODE_STATE_SYNC" : "", + dsm_partial_frame_count, + (unsigned)frame[d]); +#endif +#endif + + switch (dsm_decode_state) { + case DSM_DECODE_STATE_DESYNC: + + /* we are de-synced and only interested in the frame marker */ + if ((now - dsm_last_rx_time) > 5000) { + dsm_decode_state = DSM_DECODE_STATE_SYNC; + dsm_partial_frame_count = 0; + dsm_chan_count = 0; + dsm_frame[dsm_partial_frame_count++] = frame[d]; + } + + break; + + case DSM_DECODE_STATE_SYNC: { + dsm_frame[dsm_partial_frame_count++] = frame[d]; + + /* decode whatever we got and expect */ + if (dsm_partial_frame_count < DSM_FRAME_SIZE) { + break; + } + + /* + * Great, it looks like we might have a frame. Go ahead and + * decode it. + */ + decode_ret = dsm_decode(now, values, &dsm_chan_count, dsm_11_bit, max_channels); + + /* we consumed the partial frame, reset */ + dsm_partial_frame_count = 0; + + /* if decoding failed, set proto to desync */ + if (decode_ret == false) { + dsm_decode_state = DSM_DECODE_STATE_DESYNC; + dsm_frame_drops++; + } + } + break; + + default: +#ifdef DSM_DEBUG + printf("UNKNOWN PROTO STATE"); +#endif + decode_ret = false; + } + + + } + + if (frame_drops) { + *frame_drops = dsm_frame_drops; + } + + if (decode_ret) { + *num_values = dsm_chan_count; } dsm_last_rx_time = now; - /* - * Add bytes to the current dsm frame - */ - dsm_partial_frame_count += ret; - - /* - * If we don't have a full dsm frame, return - */ - if (dsm_partial_frame_count < DSM_FRAME_SIZE) { - return false; - } - - /* - * Great, it looks like we might have a dsm frame. Go ahead and - * decode it. - */ - dsm_partial_frame_count = 0; - return dsm_decode(now, values, num_values, max_values); + /* return false as default */ + return decode_ret; } diff --git a/src/lib/rc/dsm.h b/src/lib/rc/dsm.h index 80614d066e..669b319017 100644 --- a/src/lib/rc/dsm.h +++ b/src/lib/rc/dsm.h @@ -42,11 +42,35 @@ #pragma once #include +#include +#include +#include __BEGIN_DECLS +#define DSM_FRAME_SIZE 16 /**< DSM frame size in bytes */ +#define DSM_FRAME_CHANNELS 7 /**< Max supported DSM channels per frame */ +#define DSM_MAX_CHANNEL_COUNT 18 /**< Max channel count of any DSM RC */ +#define DSM_BUFFER_SIZE (DSM_FRAME_SIZE + DSM_FRAME_SIZE / 2) + __EXPORT int dsm_init(const char *device); -__EXPORT bool dsm_input(uint16_t *values, uint16_t *num_values, uint8_t *n_bytes, uint8_t **bytes, unsigned max_values); +__EXPORT int dsm_config(int dsm_fd); +__EXPORT bool dsm_input(int dsm_fd, uint16_t *values, uint16_t *num_values, bool *dsm_11_bit, uint8_t *n_bytes, + uint8_t **bytes, unsigned max_values); + +__EXPORT bool dsm_parse(uint64_t now, uint8_t *frame, unsigned len, uint16_t *values, + uint16_t *num_values, bool *dsm_11_bit, unsigned *frame_drops, uint16_t max_channels); + +#ifdef GPIO_SPEKTRUM_PWR_EN __EXPORT void dsm_bind(uint16_t cmd, int pulses); +#endif + +enum DSM_CMD { /* DSM bind states */ + DSM_CMD_BIND_POWER_DOWN = 0, + DSM_CMD_BIND_POWER_UP, + DSM_CMD_BIND_SET_RX_OUT, + DSM_CMD_BIND_SEND_PULSES, + DSM_CMD_BIND_REINIT_UART +}; __END_DECLS diff --git a/src/lib/rc/sbus.c b/src/lib/rc/sbus.c index f911648416..fe72bfb959 100644 --- a/src/lib/rc/sbus.c +++ b/src/lib/rc/sbus.c @@ -44,6 +44,10 @@ #include #include +#ifdef TIOCSSINGLEWIRE +#include +#endif + #include "sbus.h" #include @@ -122,6 +126,21 @@ sbus_init(const char *device, bool singlewire) { int sbus_fd = open(device, O_RDWR | O_NONBLOCK); + int ret = sbus_config(sbus_fd, singlewire); + + if (!ret) { + return sbus_fd; + + } else { + return -1; + } +} + +int +sbus_config(int sbus_fd, bool singlewire) +{ + int ret = -1; + if (sbus_fd >= 0) { struct termios t; @@ -133,8 +152,8 @@ sbus_init(const char *device, bool singlewire) if (singlewire) { /* only defined in configs capable of IOCTL */ -#ifdef SBUS_SERIAL_PORT - //ioctl(uart, TIOCSSINGLEWIRE, SER_SINGLEWIRE_ENABLED); +#ifdef TIOCSSINGLEWIRE + ioctl(sbus_fd, TIOCSSINGLEWIRE, SER_SINGLEWIRE_ENABLED); #endif } @@ -143,9 +162,11 @@ sbus_init(const char *device, bool singlewire) last_rx_time = hrt_absolute_time(); last_frame_time = last_rx_time; sbus_frame_drops = 0; + + ret = 0; } - return sbus_fd; + return ret; } void diff --git a/src/lib/rc/sbus.h b/src/lib/rc/sbus.h index 0da5ea2935..2c8f389c86 100644 --- a/src/lib/rc/sbus.h +++ b/src/lib/rc/sbus.h @@ -68,6 +68,7 @@ __EXPORT int sbus_init(const char *device, bool singlewire); * provides a degree of protection. Of course, it would be better * if we didn't drop bytes... */ +__EXPORT int sbus_config(int sbus_fd, bool singlewire); __EXPORT bool sbus_input(int sbus_fd, uint16_t *values, uint16_t *num_values, bool *sbus_failsafe, bool *sbus_frame_drop, uint16_t max_channels); diff --git a/src/modules/navigator/mission.cpp b/src/modules/navigator/mission.cpp index e4068cac38..299b69b3d0 100644 --- a/src/modules/navigator/mission.cpp +++ b/src/modules/navigator/mission.cpp @@ -303,7 +303,7 @@ Mission::advance_mission() } } -int +float Mission::get_absolute_altitude_for_item(struct mission_item_s &mission_item) { if (_mission_item.altitude_is_relative) { @@ -656,8 +656,10 @@ Mission::read_mission_item(bool onboard, bool is_current, struct mission_item_s for (int i = 0; i < 10; i++) { if (*mission_index_ptr < 0 || *mission_index_ptr >= (int)mission->count) { - /* mission item index out of bounds */ - mavlink_and_console_log_critical(_navigator->get_mavlink_fd(), "[wpm] err: index: %d, max: %d", *mission_index_ptr, (int)mission->count); + /* mission item index out of bounds - if they are equal, we just reached the end */ + if (*mission_index_ptr != (int)mission->count) { + mavlink_and_console_log_critical(_navigator->get_mavlink_fd(), "[wpm] err: index: %d, max: %d", *mission_index_ptr, (int)mission->count); + } return false; } diff --git a/src/modules/navigator/mission.h b/src/modules/navigator/mission.h index f367da1c7d..b0117cf1fe 100644 --- a/src/modules/navigator/mission.h +++ b/src/modules/navigator/mission.h @@ -133,7 +133,7 @@ private: */ void altitude_sp_foh_reset(); - int get_absolute_altitude_for_item(struct mission_item_s &mission_item); + float get_absolute_altitude_for_item(struct mission_item_s &mission_item); /** * Read current or next mission item from the dataman and watch out for DO_JUMPS diff --git a/src/modules/px4iofirmware/controls.c b/src/modules/px4iofirmware/controls.c index f7321a966d..b857aa41fa 100644 --- a/src/modules/px4iofirmware/controls.c +++ b/src/modules/px4iofirmware/controls.c @@ -74,15 +74,15 @@ static unsigned _rssi_adc_counts = 0; bool dsm_port_input(uint16_t *rssi, bool *dsm_updated, bool *st24_updated, bool *sumd_updated) { perf_begin(c_gather_dsm); - uint16_t temp_count = r_raw_rc_count; uint8_t n_bytes = 0; uint8_t *bytes; - *dsm_updated = dsm_input(r_raw_rc_values, &temp_count, &n_bytes, &bytes, PX4IO_RC_INPUT_CHANNELS); + bool dsm_11_bit; + *dsm_updated = dsm_input(_dsm_fd, r_raw_rc_values, &r_raw_rc_count, &dsm_11_bit, &n_bytes, &bytes, + PX4IO_RC_INPUT_CHANNELS); if (*dsm_updated) { - r_raw_rc_count = temp_count & 0x7fff; - if (temp_count & 0x8000) { + if (dsm_11_bit) { r_raw_rc_flags |= PX4IO_P_RAW_RC_FLAGS_RC_DSM11; } else { diff --git a/src/modules/px4iofirmware/px4io.h b/src/modules/px4iofirmware/px4io.h index 2197b7b776..3f35c471a5 100644 --- a/src/modules/px4iofirmware/px4io.h +++ b/src/modules/px4iofirmware/px4io.h @@ -170,7 +170,6 @@ extern pwm_limit_t pwm_limit; #ifdef CONFIG_ARCH_BOARD_PX4IO_V2 # define PX4IO_RELAY_CHANNELS 0 -# define POWER_SPEKTRUM(_s) stm32_gpiowrite(GPIO_SPEKTRUM_PWR_EN, (_s)) # define ENABLE_SBUS_OUT(_s) stm32_gpiowrite(GPIO_SBUS_OENABLE, !(_s)) # define VDD_SERVO_FAULT (!stm32_gpioread(GPIO_SERVO_FAULT_DETECT)) diff --git a/src/platforms/posix/main.cpp b/src/platforms/posix/main.cpp index 7bf431b4f4..4d6663006d 100644 --- a/src/platforms/posix/main.cpp +++ b/src/platforms/posix/main.cpp @@ -44,6 +44,8 @@ #include #include #include +#include +#include #include "apps.h" #include "px4_middleware.h" #include "DriverFramework.hpp" @@ -157,6 +159,7 @@ static void process_line(string &line, bool exit_on_fail) int main(int argc, char **argv) { bool daemon_mode = false; + bool chroot_on = false; signal(SIGINT, _SigIntHandler); signal(SIGFPE, _SigFpeHandler); @@ -174,6 +177,9 @@ int main(int argc, char **argv) usage(); return 0; + } else if (strcmp(argv[index], "-c") == 0) { + chroot_on = true; + } else { PX4_WARN("Unknown/unhandled parameter: %s", argv[index]); return 1; @@ -203,7 +209,7 @@ int main(int argc, char **argv) px4::init(argc, argv, "mainapp"); - //if commandfile is present, process the commands from the file + // if commandfile is present, process the commands from the file if (commands_file != nullptr) { ifstream infile(commands_file); @@ -217,6 +223,41 @@ int main(int argc, char **argv) } } + if (chroot_on) { + // Lock this application in the current working dir + // this is not an attempt to secure the environment, + // rather, to replicate a deployed file system. + +#ifdef PATH_MAX + const unsigned path_max_len = PATH_MAX; +#else + const unsigned path_max_len = 1024; +#endif + + char pwd_path[path_max_len]; + const char *folderpath = "/rootfs/"; + + if (nullptr == getcwd(pwd_path, sizeof(pwd_path))) { + PX4_ERR("Failed aquiring working dir, abort."); + exit(1); + } + + if (nullptr == strcat(pwd_path, folderpath)) { + PX4_ERR("Failed completing path, abort."); + exit(1); + } + + if (chroot(pwd_path)) { + PX4_ERR("Failed chrooting application, path: %s, error: %s.", pwd_path, strerror(errno)); + exit(1); + } + + if (chdir("/")) { + PX4_ERR("Failed changing to root dir, path: %s, error: %s.", pwd_path, strerror(errno)); + exit(1); + } + } + if (!daemon_mode) { string mystr = ""; string string_buffer[CMD_BUFF_SIZE]; diff --git a/unittests/CMakeLists.txt b/unittests/CMakeLists.txt index fcfcee3702..09c9b767f5 100644 --- a/unittests/CMakeLists.txt +++ b/unittests/CMakeLists.txt @@ -153,6 +153,12 @@ add_executable(sbus2_test sbus2_test.cpp hrt.cpp target_link_libraries( sbus2_test px4_platform ) add_gtest(sbus2_test) +# DSM test +add_executable(dsm_test dsm_test.cpp hrt.cpp + ${PX_SRC}/lib/rc/dsm.c) +target_link_libraries( dsm_test px4_platform ) +add_gtest(dsm_test) + # st24_test add_executable(rc_input_test st24_test.cpp hrt.cpp ${PX_SRC}/lib/rc/st24.c sumd_test.cpp ${PX_SRC}/lib/rc/sumd.c) target_link_libraries(rc_input_test px4_platform) diff --git a/unittests/dsm_test.cpp b/unittests/dsm_test.cpp new file mode 100644 index 0000000000..7bd6558139 --- /dev/null +++ b/unittests/dsm_test.cpp @@ -0,0 +1,74 @@ +#include +#include +#include + +#include "../../src/systemcmds/tests/tests.h" +#include +// Enable DSM parser output +#define DSM_DEBUG +#include +#include +#include + +#include "gtest/gtest.h" + +TEST(DSMTest, DSM) +{ + const char *filepath = "testdata/dsm_x_data.txt"; + + FILE *fp; + fp = fopen(filepath, "rt"); + + ASSERT_TRUE(fp); + warnx("loading data from: %s", filepath); + + float f; + unsigned x; + int ret; + + // Trash the first 20 lines + for (unsigned i = 0; i < 20; i++) { + char buf[200]; + (void)fgets(buf, sizeof(buf), fp); + } + + // Init the parser + uint8_t frame[20]; + uint16_t rc_values[18]; + uint16_t num_values; + bool dsm_11_bit; + unsigned dsm_frame_drops = 0; + uint16_t max_channels = sizeof(rc_values) / sizeof(rc_values[0]); + + int rate_limiter = 0; + unsigned last_drop = 0; + + while (EOF != (ret = fscanf(fp, "%f,%x,,", &f, &x))) { + + ASSERT_GT(ret, 0); + + frame[0] = x; + unsigned len = 1; + + // Pipe the data into the parser + bool result = dsm_parse(f*1e6, &frame[0], len, rc_values, &num_values, + &dsm_11_bit, &dsm_frame_drops, max_channels); + + if (result) { + warnx("decoded packet with %d channels and %s encoding:", num_values, (dsm_11_bit) ? "11 bit" : "10 bit"); + + for (unsigned i = 0; i < num_values; i++) { + printf("chan #%u:\t%d\n", i, (int)rc_values[i]); + } + } + + if (last_drop != (dsm_frame_drops)) { + warnx("frame dropped, now #%d", (dsm_frame_drops)); + last_drop = dsm_frame_drops; + } + + rate_limiter++; + } + + ASSERT_EQ(ret, EOF); +} diff --git a/unittests/testdata/dsm_x_data.txt b/unittests/testdata/dsm_x_data.txt new file mode 100644 index 0000000000..2a4cf782bc --- /dev/null +++ b/unittests/testdata/dsm_x_data.txt @@ -0,0 +1,1106 @@ +Time [s],Value,Parity Error,Framing Error +9.260826000000000,0x00,, +9.260914000000000,0x00,, +9.260999999999999,0x8C,, +9.261088000000001,0x00,, +9.261174000000000,0x2E,, +9.261262000000000,0xAA,, +9.261350000000000,0x14,, +9.261436000000000,0x00,, +9.261524000000000,0x1C,, +9.261609999999999,0x00,, +9.261698000000001,0x01,, +9.261786000000001,0x60,, +9.261872000000000,0x3C,, +9.261960000000000,0x00,, +9.262046000000000,0x36,, +9.262134000000000,0xAA,, +9.271818000000000,0x00,, +9.271906000000000,0x00,, +9.271991999999999,0x0C,, +9.272080000000001,0x00,, +9.272168000000001,0x2E,, +9.272254000000000,0xAA,, +9.272342000000000,0x14,, +9.272428000000000,0x00,, +9.272516000000000,0x1C,, +9.272603999999999,0x00,, +9.272690000000001,0x26,, +9.272778000000001,0xAA,, +9.272864000000000,0x44,, +9.272952000000000,0x00,, +9.273040000000000,0x4C,, +9.273126000000000,0x00,, +9.282828000000000,0x00,, +9.282916000000000,0x00,, +9.283002000000000,0x8C,, +9.283090000000000,0x00,, +9.283177999999999,0x2E,, +9.283264000000001,0xAA,, +9.283352000000001,0x14,, +9.283438000000000,0x00,, +9.283526000000000,0x1C,, +9.283614000000000,0x00,, +9.283700000000000,0x01,, +9.283787999999999,0x61,, +9.283874000000001,0x3C,, +9.283962000000001,0x00,, +9.284050000000001,0x36,, +9.284136000000000,0xAA,, +9.293830000000000,0x00,, +9.293915999999999,0x00,, +9.294003999999999,0x0C,, +9.294090000000001,0x00,, +9.294178000000000,0x2E,, +9.294266000000000,0xAA,, +9.294352000000000,0x14,, +9.294440000000000,0x00,, +9.294525999999999,0x1C,, +9.294613999999999,0x00,, +9.294701999999999,0x26,, +9.294788000000000,0xAA,, +9.294876000000000,0x44,, +9.294962000000000,0x00,, +9.295050000000000,0x4C,, +9.295138000000000,0x00,, +9.304830000000001,0x00,, +9.304918000000001,0x00,, +9.305004000000000,0x8C,, +9.305092000000000,0x00,, +9.305178000000000,0x2E,, +9.305266000000000,0xAA,, +9.305353999999999,0x14,, +9.305440000000001,0x00,, +9.305528000000001,0x1C,, +9.305614000000000,0x00,, +9.305702000000000,0x01,, +9.305790000000000,0x60,, +9.305876000000000,0x3C,, +9.305963999999999,0x00,, +9.306050000000001,0x36,, +9.306138000000001,0xAA,, +9.315832000000000,0x00,, +9.315918000000000,0x00,, +9.316006000000000,0x0C,, +9.316091999999999,0x00,, +9.316179999999999,0x2E,, +9.316268000000001,0xAA,, +9.316354000000000,0x14,, +9.316442000000000,0x00,, +9.316528000000000,0x1C,, +9.316616000000000,0x00,, +9.316704000000000,0x26,, +9.316789999999999,0xAA,, +9.316878000000001,0x44,, +9.316964000000000,0x00,, +9.317052000000000,0x4C,, +9.317140000000000,0x00,, +9.326824000000000,0x00,, +9.326910000000000,0x00,, +9.326998000000000,0x8C,, +9.327083999999999,0x00,, +9.327171999999999,0x2E,, +9.327260000000001,0xAA,, +9.327346000000000,0x14,, +9.327434000000000,0x00,, +9.327520000000000,0x1C,, +9.327608000000000,0x00,, +9.327696000000000,0x01,, +9.327781999999999,0x61,, +9.327870000000001,0x3C,, +9.327956000000000,0x00,, +9.328044000000000,0x36,, +9.328132000000000,0xAA,, +9.337834000000001,0x00,, +9.337920000000000,0x00,, +9.338008000000000,0x0C,, +9.338094000000000,0x00,, +9.338182000000000,0x2E,, +9.338270000000000,0xAA,, +9.338355999999999,0x14,, +9.338444000000001,0x00,, +9.338530000000000,0x1C,, +9.338618000000000,0x00,, +9.338706000000000,0x26,, +9.338792000000000,0xAA,, +9.338880000000000,0x44,, +9.338965999999999,0x00,, +9.339054000000001,0x4C,, +9.339142000000001,0x00,, +9.348834000000000,0x00,, +9.348922000000000,0x00,, +9.349008000000000,0x8C,, +9.349095999999999,0x00,, +9.349183999999999,0x2E,, +9.349270000000001,0xAA,, +9.349358000000001,0x14,, +9.349444000000000,0x00,, +9.349532000000000,0x1C,, +9.349620000000000,0x00,, +9.349705999999999,0x01,, +9.349793999999999,0x61,, +9.349880000000001,0x3C,, +9.349968000000001,0x00,, +9.350056000000000,0x36,, +9.350142000000000,0xAA,, +9.359836000000000,0x00,, +9.359921999999999,0x00,, +9.360010000000001,0x0C,, +9.360098000000001,0x00,, +9.360184000000000,0x2E,, +9.360272000000000,0xAA,, +9.360358000000000,0x14,, +9.360446000000000,0x00,, +9.360533999999999,0x1C,, +9.360620000000001,0x00,, +9.360708000000001,0x26,, +9.360794000000000,0xAA,, +9.360882000000000,0x44,, +9.360970000000000,0x00,, +9.361056000000000,0x4C,, +9.361143999999999,0x00,, +9.370837999999999,0x00,, +9.370924000000000,0x00,, +9.371012000000000,0x8C,, +9.371098000000000,0x00,, +9.371186000000000,0x2E,, +9.371274000000000,0xAA,, +9.371359999999999,0x14,, +9.371447999999999,0x00,, +9.371534000000000,0x1C,, +9.371622000000000,0x00,, +9.371710000000000,0x01,, +9.371796000000000,0x61,, +9.371884000000000,0x3C,, +9.371969999999999,0x00,, +9.372058000000001,0x36,, +9.372146000000001,0xAA,, +9.381840000000000,0x00,, +9.381926000000000,0x00,, +9.382014000000000,0x0C,, +9.382099999999999,0x00,, +9.382187999999999,0x2E,, +9.382275999999999,0xAA,, +9.382362000000001,0x14,, +9.382450000000000,0x00,, +9.382536000000000,0x1C,, +9.382624000000000,0x00,, +9.382712000000000,0x26,, +9.382797999999999,0xAA,, +9.382885999999999,0x44,, +9.382972000000001,0x00,, +9.383060000000000,0x4C,, +9.383148000000000,0x00,, +9.392842000000000,0x00,, +9.392927999999999,0x00,, +9.393015999999999,0x8C,, +9.393102000000001,0x00,, +9.393190000000001,0x2E,, +9.393278000000000,0xAA,, +9.393364000000000,0x14,, +9.393452000000000,0x00,, +9.393537999999999,0x1C,, +9.393625999999999,0x00,, +9.393713999999999,0x01,, +9.393800000000001,0x61,, +9.393888000000000,0x3C,, +9.393974000000000,0x00,, +9.394062000000000,0x36,, +9.394150000000000,0xAA,, +9.403834000000000,0x00,, +9.403922000000000,0x00,, +9.404007999999999,0x0C,, +9.404095999999999,0x00,, +9.404184000000001,0x2E,, +9.404270000000000,0xAA,, +9.404358000000000,0x14,, +9.404444000000000,0x00,, +9.404532000000000,0x1C,, +9.404620000000000,0x00,, +9.404705999999999,0x26,, +9.404794000000001,0xAA,, +9.404880000000000,0x44,, +9.404968000000000,0x00,, +9.405056000000000,0x4C,, +9.405142000000000,0x00,, +9.414835999999999,0x00,, +9.414923999999999,0x00,, +9.415010000000001,0x8C,, +9.415098000000000,0x00,, +9.415184000000000,0x2E,, +9.415272000000000,0xAA,, +9.415360000000000,0x14,, +9.415445999999999,0x00,, +9.415533999999999,0x1C,, +9.415620000000001,0x00,, +9.415708000000000,0x01,, +9.415796000000000,0x60,, +9.415882000000000,0x3C,, +9.415970000000000,0x00,, +9.416055999999999,0x36,, +9.416143999999999,0xAA,, +9.425838000000001,0x00,, +9.425926000000000,0x00,, +9.426012000000000,0x0C,, +9.426100000000000,0x00,, +9.426186000000000,0x2E,, +9.426273999999999,0xAA,, +9.426361999999999,0x14,, +9.426448000000001,0x00,, +9.426536000000000,0x1C,, +9.426622000000000,0x00,, +9.426710000000000,0x26,, +9.426798000000000,0xAA,, +9.426883999999999,0x44,, +9.426971999999999,0x00,, +9.427058000000001,0x4C,, +9.427146000000000,0x00,, +9.436840000000000,0x00,, +9.436926000000000,0x00,, +9.437014000000000,0x8C,, +9.437101999999999,0x00,, +9.437188000000001,0x2E,, +9.437276000000001,0xAA,, +9.437362000000000,0x14,, +9.437450000000000,0x00,, +9.437538000000000,0x1C,, +9.437624000000000,0x00,, +9.437711999999999,0x01,, +9.437798000000001,0x61,, +9.437886000000001,0x3C,, +9.437974000000001,0x00,, +9.438060000000000,0x36,, +9.438148000000000,0xAA,, +9.447842000000000,0x00,, +9.447927999999999,0x00,, +9.448016000000001,0x0C,, +9.448102000000000,0x00,, +9.448190000000000,0x2E,, +9.448278000000000,0xAA,, +9.448364000000000,0x14,, +9.448452000000000,0x00,, +9.448537999999999,0x1C,, +9.448626000000001,0x00,, +9.448714000000001,0x26,, +9.448800000000000,0xAA,, +9.448888000000000,0x44,, +9.448974000000000,0x00,, +9.449062000000000,0x4C,, +9.449149999999999,0x00,, +9.458842000000001,0x00,, +9.458930000000001,0x00,, +9.459018000000000,0x8C,, +9.459104000000000,0x00,, +9.459192000000000,0x2E,, +9.459277999999999,0xAA,, +9.459365999999999,0x14,, +9.459453999999999,0x00,, +9.459540000000001,0x1C,, +9.459628000000000,0x00,, +9.459714000000000,0x01,, +9.459802000000000,0x60,, +9.459890000000000,0x3C,, +9.459975999999999,0x00,, +9.460063999999999,0x36,, +9.460150000000001,0xAA,, +9.469844000000000,0x00,, +9.469932000000000,0x00,, +9.470018000000000,0x0C,, +9.470105999999999,0x00,, +9.470193999999999,0x2E,, +9.470280000000001,0xAA,, +9.470368000000001,0x14,, +9.470454000000000,0x00,, +9.470542000000000,0x1C,, +9.470630000000000,0x00,, +9.470715999999999,0x26,, +9.470803999999999,0xAA,, +9.470890000000001,0x44,, +9.470978000000001,0x00,, +9.471066000000000,0x4C,, +9.471152000000000,0x00,, +9.480846000000000,0x00,, +9.480931999999999,0x00,, +9.481019999999999,0x8C,, +9.481108000000001,0x00,, +9.481194000000000,0x2E,, +9.481282000000000,0xAA,, +9.481368000000000,0x14,, +9.481456000000000,0x00,, +9.481544000000000,0x1C,, +9.481629999999999,0x00,, +9.481718000000001,0x01,, +9.481804000000000,0x60,, +9.481892000000000,0x3C,, +9.481980000000000,0x00,, +9.482066000000000,0x36,, +9.482154000000000,0xAA,, +9.491838000000000,0x00,, +9.491925999999999,0x00,, +9.492012000000001,0x0C,, +9.492100000000001,0x00,, +9.492186000000000,0x2E,, +9.492274000000000,0xAA,, +9.492362000000000,0x14,, +9.492448000000000,0x00,, +9.492535999999999,0x1C,, +9.492622000000001,0x00,, +9.492710000000001,0x26,, +9.492796000000000,0xAA,, +9.492884000000000,0x44,, +9.492972000000000,0x00,, +9.493058000000000,0x4C,, +9.493145999999999,0x00,, +9.502848000000000,0x00,, +9.502934000000000,0x00,, +9.503022000000000,0x8C,, +9.503110000000000,0x00,, +9.503196000000001,0x2E,, +9.503284000000001,0xAA,, +9.503370000000000,0x14,, +9.503458000000000,0x00,, +9.503546000000000,0x1C,, +9.503632000000000,0x00,, +9.503720000000000,0x01,, +9.503806000000001,0x61,, +9.503894000000001,0x3C,, +9.503982000000001,0x00,, +9.504068000000000,0x36,, +9.504156000000000,0xAA,, +9.513847999999999,0x00,, +9.513935999999999,0x00,, +9.514023999999999,0x0C,, +9.514110000000001,0x00,, +9.514198000000000,0x2E,, +9.514284000000000,0xAA,, +9.514372000000000,0x14,, +9.514460000000000,0x00,, +9.514545999999999,0x1C,, +9.514633999999999,0x00,, +9.514720000000001,0x26,, +9.514808000000000,0xAA,, +9.514896000000000,0x44,, +9.514982000000000,0x00,, +9.515070000000000,0x4C,, +9.515155999999999,0x00,, +9.524842000000000,0x00,, +9.524927999999999,0x00,, +9.525016000000001,0x8C,, +9.525102000000000,0x00,, +9.525190000000000,0x2E,, +9.525278000000000,0xAA,, +9.525364000000000,0x14,, +9.525452000000000,0x00,, +9.525537999999999,0x1C,, +9.525626000000001,0x00,, +9.525714000000001,0x01,, +9.525800000000000,0x60,, +9.525888000000000,0x3C,, +9.525974000000000,0x00,, +9.526062000000000,0x36,, +9.526149999999999,0xAA,, +9.535852000000000,0x00,, +9.535938000000000,0x00,, +9.536026000000000,0x0C,, +9.536111999999999,0x00,, +9.536199999999999,0x2E,, +9.536288000000001,0xAA,, +9.536374000000000,0x14,, +9.536462000000000,0x00,, +9.536548000000000,0x1C,, +9.536636000000000,0x00,, +9.536724000000000,0x26,, +9.536809999999999,0xAA,, +9.536898000000001,0x44,, +9.536984000000000,0x00,, +9.537072000000000,0x4C,, +9.537160000000000,0x00,, +9.546851999999999,0x00,, +9.546939999999999,0x00,, +9.547026000000001,0x8C,, +9.547114000000001,0x00,, +9.547202000000000,0x2E,, +9.547288000000000,0xAA,, +9.547376000000000,0x14,, +9.547461999999999,0x00,, +9.547549999999999,0x1C,, +9.547637999999999,0x00,, +9.547724000000001,0x01,, +9.547812000000000,0x60,, +9.547898000000000,0x3C,, +9.547986000000000,0x00,, +9.548074000000000,0x36,, +9.548159999999999,0xAA,, +9.557846000000000,0x00,, +9.557931999999999,0x00,, +9.558020000000001,0x0C,, +9.558106000000000,0x00,, +9.558194000000000,0x2E,, +9.558282000000000,0xAA,, +9.558368000000000,0x14,, +9.558456000000000,0x00,, +9.558541999999999,0x1C,, +9.558630000000001,0x00,, +9.558718000000001,0x26,, +9.558804000000000,0xAA,, +9.558892000000000,0x44,, +9.558978000000000,0x00,, +9.559066000000000,0x4C,, +9.559153999999999,0x00,, +9.568856000000000,0x00,, +9.568944000000000,0x00,, +9.569030000000000,0x8C,, +9.569118000000000,0x00,, +9.569203999999999,0x2E,, +9.569292000000001,0xAA,, +9.569380000000001,0x14,, +9.569466000000000,0x00,, +9.569554000000000,0x1C,, +9.569640000000000,0x00,, +9.569728000000000,0x01,, +9.569815999999999,0x60,, +9.569902000000001,0x3C,, +9.569990000000001,0x00,, +9.570076000000000,0x36,, +9.570164000000000,0xAA,, +9.579848000000000,0x00,, +9.579936000000000,0x00,, +9.580024000000000,0x0C,, +9.580109999999999,0x00,, +9.580197999999999,0x2E,, +9.580284000000001,0xAA,, +9.580372000000001,0x14,, +9.580460000000000,0x00,, +9.580546000000000,0x1C,, +9.580634000000000,0x00,, +9.580719999999999,0x26,, +9.580807999999999,0xAA,, +9.580895999999999,0x44,, +9.580982000000001,0x00,, +9.581070000000000,0x4C,, +9.581156000000000,0x00,, +9.590850000000000,0x00,, +9.590938000000000,0x00,, +9.591024000000001,0x8C,, +9.591112000000001,0x00,, +9.591200000000001,0x2E,, +9.591286000000000,0xAA,, +9.591374000000000,0x14,, +9.591460000000000,0x00,, +9.591548000000000,0x1C,, +9.591635999999999,0x00,, +9.591722000000001,0x01,, +9.591810000000001,0x60,, +9.591896000000000,0x3C,, +9.591984000000000,0x00,, +9.592072000000000,0x36,, +9.592158000000000,0xAA,, +9.601851999999999,0x00,, +9.601938000000001,0x00,, +9.602026000000000,0x0C,, +9.602114000000000,0x00,, +9.602200000000000,0x2E,, +9.602288000000000,0xAA,, +9.602373999999999,0x14,, +9.602461999999999,0x00,, +9.602550000000001,0x1C,, +9.602636000000000,0x00,, +9.602724000000000,0x26,, +9.602810000000000,0xAA,, +9.602898000000000,0x44,, +9.602986000000000,0x00,, +9.603071999999999,0x4C,, +9.603160000000001,0x00,, +9.612852000000000,0x00,, +9.612940000000000,0x00,, +9.613028000000000,0x8C,, +9.613113999999999,0x00,, +9.613201999999999,0x2E,, +9.613288000000001,0xAA,, +9.613376000000001,0x14,, +9.613464000000000,0x00,, +9.613550000000000,0x1C,, +9.613638000000000,0x00,, +9.613723999999999,0x01,, +9.613811999999999,0x61,, +9.613898000000001,0x3C,, +9.613986000000001,0x00,, +9.614074000000000,0x36,, +9.614160000000000,0xAA,, +9.623854000000000,0x00,, +9.623939999999999,0x00,, +9.624027999999999,0x0C,, +9.624116000000001,0x00,, +9.624202000000000,0x2E,, +9.624290000000000,0xAA,, +9.624376000000000,0x14,, +9.624464000000000,0x00,, +9.624549999999999,0x1C,, +9.624637999999999,0x00,, +9.624726000000001,0x26,, +9.624812000000000,0xAA,, +9.624900000000000,0x44,, +9.624986000000000,0x00,, +9.625074000000000,0x4C,, +9.625162000000000,0x00,, +9.634854000000001,0x00,, +9.634942000000001,0x00,, +9.635028000000000,0x8C,, +9.635116000000000,0x00,, +9.635204000000000,0x2E,, +9.635289999999999,0xAA,, +9.635377999999999,0x14,, +9.635464000000001,0x00,, +9.635552000000001,0x1C,, +9.635640000000000,0x00,, +9.635726000000000,0x01,, +9.635814000000000,0x61,, +9.635899999999999,0x3C,, +9.635987999999999,0x00,, +9.636075999999999,0x36,, +9.636162000000001,0xAA,, +9.645856000000000,0x00,, +9.645944000000000,0x00,, +9.646030000000000,0x0C,, +9.646118000000000,0x00,, +9.646203999999999,0x2E,, +9.646292000000001,0xAA,, +9.646380000000001,0x14,, +9.646466000000000,0x00,, +9.646554000000000,0x1C,, +9.646640000000000,0x00,, +9.646728000000000,0x26,, +9.646815999999999,0xAA,, +9.646902000000001,0x44,, +9.646990000000001,0x00,, +9.647076000000000,0x4C,, +9.647164000000000,0x00,, +9.656858000000000,0x00,, +9.656943999999999,0x00,, +9.657031999999999,0x8C,, +9.657118000000001,0x00,, +9.657206000000000,0x2E,, +9.657294000000000,0xAA,, +9.657380000000000,0x14,, +9.657468000000000,0x00,, +9.657553999999999,0x1C,, +9.657641999999999,0x00,, +9.657730000000001,0x01,, +9.657816000000000,0x61,, +9.657904000000000,0x3C,, +9.657990000000000,0x00,, +9.658078000000000,0x36,, +9.658166000000000,0xAA,, +9.667858000000001,0x00,, +9.667946000000001,0x00,, +9.668032000000000,0x0C,, +9.668120000000000,0x00,, +9.668208000000000,0x2E,, +9.668293999999999,0xAA,, +9.668381999999999,0x14,, +9.668468000000001,0x00,, +9.668556000000001,0x1C,, +9.668644000000000,0x00,, +9.668730000000000,0x26,, +9.668818000000000,0xAA,, +9.668903999999999,0x44,, +9.668991999999999,0x00,, +9.669079999999999,0x4C,, +9.669166000000001,0x00,, +9.678860000000000,0x00,, +9.678946000000000,0x00,, +9.679034000000000,0x8C,, +9.679122000000000,0x00,, +9.679207999999999,0x2E,, +9.679296000000001,0xAA,, +9.679382000000000,0x14,, +9.679470000000000,0x00,, +9.679556000000000,0x1C,, +9.679644000000000,0x00,, +9.679732000000000,0x01,, +9.679817999999999,0x60,, +9.679906000000001,0x3C,, +9.679992000000000,0x00,, +9.680080000000000,0x36,, +9.680168000000000,0xAA,, +9.689859999999999,0x00,, +9.689947999999999,0x00,, +9.690034000000001,0x0C,, +9.690122000000001,0x00,, +9.690210000000000,0x2E,, +9.690296000000000,0xAA,, +9.690384000000000,0x14,, +9.690469999999999,0x00,, +9.690557999999999,0x1C,, +9.690644000000001,0x00,, +9.690732000000001,0x26,, +9.690820000000000,0xAA,, +9.690906000000000,0x44,, +9.690994000000000,0x00,, +9.691079999999999,0x4C,, +9.691167999999999,0x00,, +9.700862000000001,0x00,, +9.700948000000000,0x00,, +9.701036000000000,0x8C,, +9.701122000000000,0x00,, +9.701210000000000,0x2E,, +9.701298000000000,0xAA,, +9.701383999999999,0x14,, +9.701472000000001,0x00,, +9.701558000000000,0x1C,, +9.701646000000000,0x00,, +9.701734000000000,0x01,, +9.701820000000000,0x61,, +9.701908000000000,0x3C,, +9.701993999999999,0x00,, +9.702082000000001,0x36,, +9.702170000000001,0xAA,, +9.711862000000000,0x00,, +9.711950000000000,0x00,, +9.712038000000000,0x0C,, +9.712123999999999,0x00,, +9.712211999999999,0x2E,, +9.712298000000001,0xAA,, +9.712386000000000,0x14,, +9.712474000000000,0x00,, +9.712560000000000,0x1C,, +9.712648000000000,0x00,, +9.712733999999999,0x26,, +9.712821999999999,0xAA,, +9.712910000000001,0x44,, +9.712996000000000,0x00,, +9.713084000000000,0x4C,, +9.713170000000000,0x00,, +9.722864000000000,0x00,, +9.722951999999999,0x00,, +9.723038000000001,0x8C,, +9.723126000000001,0x00,, +9.723212000000000,0x2E,, +9.723300000000000,0xAA,, +9.723388000000000,0x14,, +9.723474000000000,0x00,, +9.723561999999999,0x1C,, +9.723648000000001,0x00,, +9.723736000000001,0x01,, +9.723824000000000,0x60,, +9.723910000000000,0x3C,, +9.723998000000000,0x00,, +9.724084000000000,0x36,, +9.724171999999999,0xAA,, +9.733866000000001,0x00,, +9.733952000000000,0x00,, +9.734040000000000,0x0C,, +9.734126000000000,0x00,, +9.734214000000000,0x2E,, +9.734302000000000,0xAA,, +9.734387999999999,0x14,, +9.734476000000001,0x00,, +9.734562000000000,0x1C,, +9.734650000000000,0x00,, +9.734738000000000,0x26,, +9.734824000000000,0xAA,, +9.734912000000000,0x44,, +9.734997999999999,0x00,, +9.735086000000001,0x4C,, +9.735174000000001,0x00,, +9.744866000000000,0x00,, +9.744954000000000,0x00,, +9.745039999999999,0x8C,, +9.745127999999999,0x00,, +9.745215999999999,0x2E,, +9.745302000000001,0xAA,, +9.745390000000000,0x14,, +9.745476000000000,0x00,, +9.745564000000000,0x1C,, +9.745652000000000,0x00,, +9.745737999999999,0x01,, +9.745825999999999,0x60,, +9.745912000000001,0x3C,, +9.746000000000000,0x00,, +9.746088000000000,0x36,, +9.746174000000000,0xAA,, +9.755858000000000,0x00,, +9.755946000000000,0x00,, +9.756034000000000,0x0C,, +9.756119999999999,0x00,, +9.756208000000001,0x2E,, +9.756294000000000,0xAA,, +9.756382000000000,0x14,, +9.756470000000000,0x00,, +9.756556000000000,0x1C,, +9.756644000000000,0x00,, +9.756729999999999,0x26,, +9.756818000000001,0xAA,, +9.756906000000001,0x44,, +9.756992000000000,0x00,, +9.757080000000000,0x4C,, +9.757166000000000,0x00,, +9.766868000000001,0x00,, +9.766956000000000,0x00,, +9.767042000000000,0x8C,, +9.767130000000000,0x00,, +9.767218000000000,0x2E,, +9.767303999999999,0xAA,, +9.767391999999999,0x14,, +9.767478000000001,0x00,, +9.767566000000000,0x1C,, +9.767654000000000,0x00,, +9.767740000000000,0x01,, +9.767828000000000,0x61,, +9.767913999999999,0x3C,, +9.768001999999999,0x00,, +9.768090000000001,0x36,, +9.768176000000000,0xAA,, +9.777870000000000,0x00,, +9.777956000000000,0x00,, +9.778044000000000,0x0C,, +9.778131999999999,0x00,, +9.778218000000001,0x2E,, +9.778306000000001,0xAA,, +9.778392000000000,0x14,, +9.778480000000000,0x00,, +9.778568000000000,0x1C,, +9.778654000000000,0x00,, +9.778741999999999,0x26,, +9.778828000000001,0xAA,, +9.778916000000001,0x44,, +9.779004000000000,0x00,, +9.779090000000000,0x4C,, +9.779178000000000,0x00,, +9.788869999999999,0x00,, +9.788957999999999,0x00,, +9.789046000000001,0x8C,, +9.789132000000000,0x00,, +9.789220000000000,0x2E,, +9.789306000000000,0xAA,, +9.789394000000000,0x14,, +9.789482000000000,0x00,, +9.789567999999999,0x1C,, +9.789656000000001,0x00,, +9.789742000000000,0x01,, +9.789830000000000,0x61,, +9.789918000000000,0x3C,, +9.790004000000000,0x00,, +9.790092000000000,0x36,, +9.790177999999999,0xAA,, +9.799863999999999,0x00,, +9.799950000000001,0x00,, +9.800038000000001,0x0C,, +9.800126000000001,0x00,, +9.800212000000000,0x2E,, +9.800300000000000,0xAA,, +9.800386000000000,0x14,, +9.800473999999999,0x00,, +9.800561999999999,0x1C,, +9.800648000000001,0x00,, +9.800736000000001,0x26,, +9.800822000000000,0xAA,, +9.800910000000000,0x44,, +9.800998000000000,0x00,, +9.801083999999999,0x4C,, +9.801171999999999,0x00,, +9.810874000000000,0x00,, +9.810962000000000,0x00,, +9.811048000000000,0x8C,, +9.811135999999999,0x00,, +9.811223999999999,0x2E,, +9.811310000000001,0xAA,, +9.811398000000001,0x14,, +9.811484000000000,0x00,, +9.811572000000000,0x1C,, +9.811660000000000,0x00,, +9.811745999999999,0x01,, +9.811833999999999,0x61,, +9.811920000000001,0x3C,, +9.812008000000001,0x00,, +9.812096000000000,0x36,, +9.812182000000000,0xAA,, +9.821876000000000,0x00,, +9.821963999999999,0x00,, +9.822050000000001,0x0C,, +9.822138000000001,0x00,, +9.822224000000000,0x2E,, +9.822312000000000,0xAA,, +9.822400000000000,0x14,, +9.822486000000000,0x00,, +9.822573999999999,0x1C,, +9.822660000000001,0x00,, +9.822748000000001,0x26,, +9.822836000000001,0xAA,, +9.822922000000000,0x44,, +9.823010000000000,0x00,, +9.823096000000000,0x4C,, +9.823183999999999,0x00,, +9.832870000000000,0x00,, +9.832955999999999,0x00,, +9.833043999999999,0x8C,, +9.833130000000001,0x00,, +9.833218000000000,0x2E,, +9.833306000000000,0xAA,, +9.833392000000000,0x14,, +9.833480000000000,0x00,, +9.833565999999999,0x1C,, +9.833653999999999,0x00,, +9.833742000000001,0x01,, +9.833828000000000,0x61,, +9.833916000000000,0x3C,, +9.834002000000000,0x00,, +9.834090000000000,0x36,, +9.834178000000000,0xAA,, +9.843870000000001,0x00,, +9.843958000000001,0x00,, +9.844044000000000,0x0C,, +9.844132000000000,0x00,, +9.844220000000000,0x2E,, +9.844306000000000,0xAA,, +9.844393999999999,0x14,, +9.844480000000001,0x00,, +9.844568000000001,0x1C,, +9.844656000000001,0x00,, +9.844742000000000,0x26,, +9.844830000000000,0xAA,, +9.844916000000000,0x44,, +9.845003999999999,0x00,, +9.845091999999999,0x4C,, +9.845178000000001,0x00,, +9.854872000000000,0x00,, +9.854958000000000,0x00,, +9.855046000000000,0x8C,, +9.855134000000000,0x00,, +9.855219999999999,0x2E,, +9.855308000000001,0xAA,, +9.855394000000000,0x14,, +9.855482000000000,0x00,, +9.855570000000000,0x1C,, +9.855656000000000,0x00,, +9.855744000000000,0x01,, +9.855829999999999,0x61,, +9.855918000000001,0x3C,, +9.856006000000001,0x00,, +9.856092000000000,0x36,, +9.856180000000000,0xAA,, +9.865881999999999,0x00,, +9.865968000000001,0x00,, +9.866056000000000,0x0C,, +9.866142000000000,0x00,, +9.866230000000000,0x2E,, +9.866318000000000,0xAA,, +9.866403999999999,0x14,, +9.866491999999999,0x00,, +9.866578000000001,0x1C,, +9.866666000000000,0x00,, +9.866754000000000,0x26,, +9.866840000000000,0xAA,, +9.866928000000000,0x44,, +9.867013999999999,0x00,, +9.867101999999999,0x4C,, +9.867190000000001,0x00,, +9.876882000000000,0x00,, +9.876970000000000,0x00,, +9.877056000000000,0x8C,, +9.877143999999999,0x00,, +9.877231999999999,0x2E,, +9.877318000000001,0xAA,, +9.877406000000001,0x14,, +9.877492000000000,0x00,, +9.877580000000000,0x1C,, +9.877668000000000,0x00,, +9.877753999999999,0x01,, +9.877841999999999,0x61,, +9.877928000000001,0x3C,, +9.878016000000001,0x00,, +9.878104000000000,0x36,, +9.878190000000000,0xAA,, +9.887874000000000,0x00,, +9.887962000000000,0x00,, +9.888050000000000,0x0C,, +9.888135999999999,0x00,, +9.888223999999999,0x2E,, +9.888310000000001,0xAA,, +9.888398000000000,0x14,, +9.888486000000000,0x00,, +9.888572000000000,0x1C,, +9.888660000000000,0x00,, +9.888745999999999,0x26,, +9.888833999999999,0xAA,, +9.888922000000001,0x44,, +9.889008000000000,0x00,, +9.889096000000000,0x4C,, +9.889182000000000,0x00,, +9.898876000000000,0x00,, +9.898963999999999,0x00,, +9.899050000000001,0x8C,, +9.899138000000001,0x00,, +9.899224000000000,0x2E,, +9.899312000000000,0xAA,, +9.899400000000000,0x14,, +9.899486000000000,0x00,, +9.899573999999999,0x1C,, +9.899660000000001,0x00,, +9.899748000000001,0x01,, +9.899836000000001,0x61,, +9.899922000000000,0x3C,, +9.900010000000000,0x00,, +9.900096000000000,0x36,, +9.900183999999999,0xAA,, +9.909878000000001,0x00,, +9.909964000000000,0x00,, +9.910052000000000,0x0C,, +9.910226000000000,0x2E,, +9.910314000000000,0xAA,, +9.910399999999999,0x14,, +9.910488000000001,0x00,, +9.910574000000000,0x1C,, +9.910662000000000,0x00,, +9.910836000000000,0xAA,, +9.910924000000000,0x44,, +9.911009999999999,0x00,, +9.911098000000001,0x4C,, +9.911186000000001,0x00,, +9.920878000000000,0x00,, +9.920966000000000,0x00,, +9.921052000000000,0x8C,, +9.921139999999999,0x00,, +9.921227999999999,0x2E,, +9.921314000000001,0xAA,, +9.921402000000000,0x14,, +9.921488000000000,0x00,, +9.921576000000000,0x1C,, +9.921664000000000,0x00,, +9.921749999999999,0x01,, +9.921837999999999,0x60,, +9.921924000000001,0x3C,, +9.922012000000000,0x00,, +9.922100000000000,0x36,, +9.922186000000000,0xAA,, +9.932054000000001,0x0C,, +9.932140000000000,0x00,, +9.932228000000000,0x2E,, +9.932316000000000,0xAA,, +9.932402000000000,0x14,, +9.932490000000000,0x00,, +9.932575999999999,0x1C,, +9.932664000000001,0x00,, +9.932752000000001,0x26,, +9.932838000000000,0xAA,, +9.932926000000000,0x44,, +9.933012000000000,0x00,, +9.933100000000000,0x4C,, +9.933187999999999,0x00,, +9.942888000000000,0x00,, +9.942976000000000,0x00,, +9.943064000000000,0x8C,, +9.943149999999999,0x00,, +9.943237999999999,0x2E,, +9.943324000000000,0xAA,, +9.943412000000000,0x14,, +9.943500000000000,0x00,, +9.943586000000000,0x1C,, +9.943674000000000,0x00,, +9.943759999999999,0x01,, +9.943847999999999,0x61,, +9.943936000000001,0x3C,, +9.944022000000000,0x00,, +9.944110000000000,0x36,, +9.944196000000000,0xAA,, +9.953882000000000,0x00,, +9.954751999999999,0x26,, +9.954840000000001,0xAA,, +9.954928000000001,0x44,, +9.955014000000000,0x00,, +9.955102000000000,0x4C,, +9.955188000000000,0x00,, +9.964890000000000,0x00,, +9.964978000000000,0x00,, +9.965066000000000,0x8C,, +9.965152000000000,0x00,, +9.965240000000000,0x2E,, +9.965325999999999,0xAA,, +9.965414000000001,0x14,, +9.965502000000001,0x00,, +9.965588000000000,0x1C,, +9.965676000000000,0x00,, +9.965762000000000,0x01,, +9.965850000000000,0x60,, +9.965938000000000,0x3C,, +9.966024000000001,0x00,, +9.966112000000001,0x36,, +9.966198000000000,0xAA,, +9.975882000000000,0x00,, +9.975970000000000,0x00,, +9.976058000000000,0x0C,, +9.976144000000000,0x00,, +9.976232000000000,0x2E,, +9.976317999999999,0xAA,, +9.976406000000001,0x14,, +9.976494000000001,0x00,, +9.976580000000000,0x1C,, +9.976668000000000,0x00,, +9.976754000000000,0x26,, +9.976842000000000,0xAA,, +9.976929999999999,0x44,, +9.977016000000001,0x00,, +9.977104000000001,0x4C,, +9.977190000000000,0x00,, +9.986884000000000,0x00,, +9.986969999999999,0x00,, +9.987057999999999,0x8C,, +9.987144000000001,0x00,, +9.987232000000001,0x2E,, +9.987320000000000,0xAA,, +9.987406000000000,0x14,, +9.987494000000000,0x00,, +9.987579999999999,0x1C,, +9.987667999999999,0x00,, +9.987755999999999,0x01,, +9.987842000000001,0x61,, +9.987930000000000,0x3C,, +9.988016000000000,0x00,, +9.988104000000000,0x36,, +9.988192000000000,0xAA,, +9.997884000000001,0x00,, +9.997972000000001,0x00,, +9.998058000000000,0x0C,, +9.998146000000000,0x00,, +9.998232000000000,0x2E,, +9.998320000000000,0xAA,, +9.998408000000000,0x14,, +9.998494000000001,0x00,, +9.998582000000001,0x1C,, +9.998668000000000,0x00,, +9.998756000000000,0x26,, +9.998844000000000,0xAA,, +9.998930000000000,0x44,, +9.999018000000000,0x00,, +9.999104000000001,0x4C,, +9.999192000000001,0x00,, +10.008894000000000,0x00,, +10.008979999999999,0x00,, +10.009067999999999,0x8C,, +10.009156000000001,0x00,, +10.009242000000000,0x2E,, +10.009330000000000,0xAA,, +10.009416000000000,0x14,, +10.009504000000000,0x00,, +10.009592000000000,0x1C,, +10.009677999999999,0x00,, +10.009766000000001,0x01,, +10.009852000000000,0x60,, +10.009940000000000,0x3C,, +10.010028000000000,0x00,, +10.010114000000000,0x36,, +10.010202000000000,0xAA,, +10.019886000000000,0x00,, +10.019971999999999,0x00,, +10.020060000000001,0x0C,, +10.020148000000001,0x00,, +10.020234000000000,0x2E,, +10.020322000000000,0xAA,, +10.020408000000000,0x14,, +10.020496000000000,0x00,, +10.020583999999999,0x1C,, +10.020670000000001,0x00,, +10.020758000000001,0x26,, +10.020844000000000,0xAA,, +10.020932000000000,0x44,, +10.021020000000000,0x00,,