#![no_main]
#![no_std]
extern crate panic_semihosting;
#[macro_use(block)]
extern crate nb;
use cortex_m_rt::entry;
use hal::drivers::pins::Level;
use hal::drivers::{
touch::{profile_touch_sensing, ButtonPins, Edge, TouchSensor, TouchSensorChannel},
Pins, Timer,
};
use hal::prelude::*;
pub use hal::typestates::pin::state;
use lpc55_hal as hal;
#[entry]
fn main() -> ! {
let mut hal = hal::new();
let clocks = hal::ClockRequirements::default()
.system_frequency(96.MHz())
.configure(&mut hal.anactrl, &mut hal.pmc, &mut hal.syscon)
.unwrap();
let fro_token = clocks.support_1mhz_fro_token().unwrap();
let touch_token = clocks.support_touch_token().unwrap();
let mut gpio = hal.gpio.enabled(&mut hal.syscon);
let mut iocon = hal.iocon.enabled(&mut hal.syscon);
let pins = Pins::take().unwrap();
let but1 = pins.pio0_23.into_analog_input(&mut iocon, &mut gpio); let but2 = pins.pio0_31.into_analog_input(&mut iocon, &mut gpio); let but3 = pins.pio0_15.into_analog_input(&mut iocon, &mut gpio);
let mut green = pins
.pio0_5
.into_gpio_pin(&mut iocon, &mut gpio)
.into_output(Level::High);
let mut red = pins
.pio1_19
.into_gpio_pin(&mut iocon, &mut gpio)
.into_output(Level::High);
let mut blue = pins
.pio1_21
.into_gpio_pin(&mut iocon, &mut gpio)
.into_output(Level::High);
let mut delay_timer = Timer::new(hal.ctimer.0.enabled(&mut hal.syscon, fro_token));
let button_pins = ButtonPins(but1, but2, but3);
let adc = hal.adc.enabled(&mut hal.pmc, &mut hal.syscon);
let touch_timer = hal
.ctimer
.1
.enabled(&mut hal.syscon, clocks.support_1mhz_fro_token().unwrap());
let touch_sync_timer = hal
.ctimer
.2
.enabled(&mut hal.syscon, clocks.support_1mhz_fro_token().unwrap());
let charge_pin = pins.pio1_16.into_match_output(&mut iocon);
let mut dma = hal.dma.enabled(&mut hal.syscon);
let touch_sensor = TouchSensor::new(
[13_900, 13_900, 13_900],
5,
adc,
touch_timer,
touch_sync_timer,
charge_pin,
button_pins,
);
let mut touch_sensor = touch_sensor.enabled(&mut dma, touch_token);
{
let mut counts = [0u32; 3];
let mut times = [0u32; 128];
let mut results = [0u32; 128];
profile_touch_sensing(
&mut touch_sensor,
&mut delay_timer,
&mut results,
&mut times,
);
for i in 0..125 {
let src = (results[i] & (0xf << 24)) >> 24;
let _sample_num = (times[i] - 1196) / 802;
let _button_sample_num = (times[i] - 1192) / (802 * 3);
counts[(src - 3) as usize] += 1;
}
}
delay_timer.start(300_000.microseconds());
block!(delay_timer.wait()).unwrap();
loop {
if touch_sensor.has_edge(TouchSensorChannel::Channel1, Edge::Falling) {
touch_sensor.reset_results(TouchSensorChannel::Channel1, -1);
red.set_low().unwrap();
}
if touch_sensor.has_edge(TouchSensorChannel::Channel2, Edge::Falling) {
touch_sensor.reset_results(TouchSensorChannel::Channel2, -1);
green.set_low().unwrap();
}
if touch_sensor.has_edge(TouchSensorChannel::Channel3, Edge::Falling) {
touch_sensor.reset_results(TouchSensorChannel::Channel3, -1);
blue.set_low().unwrap();
}
if touch_sensor.has_edge(TouchSensorChannel::Channel1, Edge::Rising) {
touch_sensor.reset_results(TouchSensorChannel::Channel1, 1);
red.set_high().unwrap();
}
if touch_sensor.has_edge(TouchSensorChannel::Channel2, Edge::Rising) {
touch_sensor.reset_results(TouchSensorChannel::Channel2, 1);
green.set_high().unwrap();
}
if touch_sensor.has_edge(TouchSensorChannel::Channel3, Edge::Rising) {
touch_sensor.reset_results(TouchSensorChannel::Channel3, 1);
blue.set_high().unwrap();
}
}
}