From 52d4a4917e49e3864cb50cb37cfd86537e42a287 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Tue, 26 Mar 2013 21:00:36 +0100 Subject: digital/io-hub/src/apbirthday: add US sensors ADC --- digital/io-hub/src/apbirthday/Makefile | 2 +- digital/io-hub/src/apbirthday/hardware.hh | 7 +++++++ digital/io-hub/src/apbirthday/hardware.host.cc | 6 +++++- digital/io-hub/src/apbirthday/hardware.stm32.cc | 8 +++++++- digital/io-hub/src/apbirthday/robot.cc | 18 +++++++++++++++++- digital/io-hub/src/apbirthday/robot.hh | 2 ++ 6 files changed, 39 insertions(+), 4 deletions(-) (limited to 'digital/io-hub/src/apbirthday') diff --git a/digital/io-hub/src/apbirthday/Makefile b/digital/io-hub/src/apbirthday/Makefile index 473acdff..02cd0d4e 100644 --- a/digital/io-hub/src/apbirthday/Makefile +++ b/digital/io-hub/src/apbirthday/Makefile @@ -10,7 +10,7 @@ apbirthday_SOURCES = main.cc robot.cc hardware.host.cc hardware.stm32.cc \ angfsm.host.c angfsm_gen_arm_AI.arm.c fsm_queue.cc \ $(AVR_SOURCES) -MODULES = utils hal/gpio hal/uart hal/usb hal/i2c hal/spi \ +MODULES = utils hal/gpio hal/adc hal/uart hal/usb hal/i2c hal/spi \ base/proto dev/avrisp # Hack mode, include old code from AVR modules. diff --git a/digital/io-hub/src/apbirthday/hardware.hh b/digital/io-hub/src/apbirthday/hardware.hh index f3378170..5713f921 100644 --- a/digital/io-hub/src/apbirthday/hardware.hh +++ b/digital/io-hub/src/apbirthday/hardware.hh @@ -26,6 +26,7 @@ #include "ucoolib/hal/uart/uart.hh" #include "ucoolib/hal/gpio/gpio.hh" +#include "ucoolib/hal/adc/adc.hh" #include "ucoolib/hal/i2c/i2c.hh" #ifdef TARGET_stm32 # include "ucoolib/hal/usb/usb.hh" @@ -84,6 +85,12 @@ struct Hardware pneum_open; static const int inputs_nb = 9; static const int outputs_nb = 21; +#ifdef TARGET_stm32 + ucoo::AdcHard adc; + ucoo::AdcHardChannel adc_dist0, adc_dist1, adc_dist2, adc_dist3; +#else + ucoo::AdcHost adc_dist0, adc_dist1, adc_dist2, adc_dist3; +#endif Hardware (); // Wait until next cycle. void wait (); diff --git a/digital/io-hub/src/apbirthday/hardware.host.cc b/digital/io-hub/src/apbirthday/hardware.host.cc index ba25401b..1cffaa7e 100644 --- a/digital/io-hub/src/apbirthday/hardware.host.cc +++ b/digital/io-hub/src/apbirthday/hardware.host.cc @@ -61,7 +61,11 @@ Hardware::Hardware () gift_out (host, "gift_out"), gift_in (host, "gift_in"), ballon_funny_action (host, "ballon_funny_action"), - pneum_open (host, "pneum_open") + pneum_open (host, "pneum_open"), + adc_dist0 (host, "dist0", 1 << 12), + adc_dist1 (host, "dist1", 1 << 12), + adc_dist2 (host, "dist2", 1 << 12), + adc_dist3 (host, "dist3", 1 << 12) { dev_uart.block (false); zb_uart.block (false); diff --git a/digital/io-hub/src/apbirthday/hardware.stm32.cc b/digital/io-hub/src/apbirthday/hardware.stm32.cc index a3cd4c1d..ed051a4a 100644 --- a/digital/io-hub/src/apbirthday/hardware.stm32.cc +++ b/digital/io-hub/src/apbirthday/hardware.stm32.cc @@ -54,7 +54,10 @@ Hardware::Hardware () glass_upper_clamp_up (GPIOD, 3), glass_upper_clamp_down (GPIOC, 10), gift_out (GPIOD, 4), gift_in (GPIOC, 11), ballon_funny_action (GPIOB, 7), - pneum_open (GPIOD, 5) + pneum_open (GPIOD, 5), + adc (0), + adc_dist0 (adc, 0), adc_dist1 (adc, 1), + adc_dist2 (adc, 2), adc_dist3 (adc, 3) { rcc_peripheral_enable_clock (&RCC_AHB1ENR, RCC_AHB1ENR_IOPAEN); rcc_peripheral_enable_clock (&RCC_AHB1ENR, RCC_AHB1ENR_IOPBEN); @@ -84,6 +87,9 @@ Hardware::Hardware () gpio_set_af (GPIOA, GPIO_AF4, GPIO8); gpio_set_af (GPIOC, GPIO_AF4, GPIO9); main_i2c.enable (); + // ADC. + gpio_mode_setup (GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, + GPIO0 | GPIO1 | GPIO2 | GPIO3); // Cycle timer, 4 ms period. rcc_peripheral_enable_clock (&RCC_APB1ENR, RCC_APB1ENR_TIM3EN); TIM3_PSC = 2 * rcc_ppre1_frequency / 1000000 - 1; // 1 µs prescaler diff --git a/digital/io-hub/src/apbirthday/robot.cc b/digital/io-hub/src/apbirthday/robot.cc index 2dc3de95..d8b47387 100644 --- a/digital/io-hub/src/apbirthday/robot.cc +++ b/digital/io-hub/src/apbirthday/robot.cc @@ -41,7 +41,7 @@ Robot::Robot () outputs_set_ (outputs_, lengthof (outputs_)), stats_proto_ (0), stats_chrono_ (false), stats_chrono_last_s_ (-1), - stats_inputs_ (0) + stats_inputs_ (0), stats_usdist_ (0) { robot = this; unsigned i = 0; @@ -212,6 +212,12 @@ Robot::proto_handle (ucoo::Proto &proto, char cmd, const uint8_t *args, int size stats_inputs_cpt_ = stats_inputs_ = args[0]; stats_proto_ = &proto; break; + case c ('U', 1): + // US distance sensors stats. + // 1B: stat interval. + stats_usdist_cpt_ = stats_usdist_ = args[0]; + stats_proto_ = &proto; + break; default: proto.send ('?'); return; @@ -245,5 +251,15 @@ Robot::proto_stats () stats_proto_->send ('I', "L", inputs); stats_inputs_cpt_ = stats_inputs_; } + if (stats_usdist_ && !--stats_usdist_cpt_) + { + // TODO: this is a hack, only work in simulation. + stats_proto_->send ('U', "HHHH", + hardware.adc_dist0.read (), + hardware.adc_dist1.read (), + hardware.adc_dist2.read (), + hardware.adc_dist3.read ()); + stats_usdist_cpt_ = stats_usdist_; + } } diff --git a/digital/io-hub/src/apbirthday/robot.hh b/digital/io-hub/src/apbirthday/robot.hh index 99997fd0..492b6e2d 100644 --- a/digital/io-hub/src/apbirthday/robot.hh +++ b/digital/io-hub/src/apbirthday/robot.hh @@ -88,6 +88,8 @@ class Robot : public ucoo::Proto::Handler int stats_chrono_last_s_; /// Input stats interval and counter. int stats_inputs_, stats_inputs_cpt_; + /// US distance sensors stats interval and counter. + int stats_usdist_, stats_usdist_cpt_; }; /// Global instance pointer. -- cgit v1.2.3