//! Makes the pygamer appear as a USB serial port loop back device. //! Repeats back all characters sent to it, but in upper case. #![no_std] #![no_main] use edgebadge::{entry, hal, pac, Pins}; use panic_halt as _; use hal::clock::GenericClockController; use hal::prelude::*; use pac::{CorePeripherals, Peripherals}; use usb_device::prelude::*; use usbd_serial::{SerialPort, USB_CLASS_CDC}; #[entry] fn main() -> ! { let mut peripherals = Peripherals::take().unwrap(); let mut _core = CorePeripherals::take().unwrap(); let mut clocks = GenericClockController::with_internal_32kosc( peripherals.GCLK, &mut peripherals.MCLK, &mut peripherals.OSC32KCTRL, &mut peripherals.OSCCTRL, &mut peripherals.NVMCTRL, ); let mut pins = Pins::new(peripherals.PORT).split(); let usb_bus = pins .usb .init(peripherals.USB, &mut clocks, &mut peripherals.MCLK); let mut serial = SerialPort::new(&usb_bus); let mut led = pins.led_pin.into_open_drain_output(&mut pins.port); let mut usb_dev = UsbDeviceBuilder::new(&usb_bus, UsbVidPid(0x16c0, 0x27dd)) .manufacturer("Fake company") .product("Serial port") .serial_number("TEST") .device_class(USB_CLASS_CDC) .build(); loop { if !usb_dev.poll(&mut [&mut serial]) { continue; } let mut buf = [0u8; 64]; match serial.read(&mut buf) { Ok(count) if count > 0 => { let _ = led.set_high(); // Turn on // Echo back in upper case for c in buf[0..count].iter_mut() { if 0x61 <= *c && *c <= 0x7a { *c &= !0x20; } } let mut write_offset = 0; while write_offset < count { match serial.write(&buf[write_offset..count]) { Ok(len) if len > 0 => { write_offset += len; } _ => {} } } } _ => {} } let _ = led.set_low(); // Turn off } }