| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- /*
- Abstracted transport for reading and writing data from a UART-based
- device such as a TMC2209
- Written with help by Claude!
- https://claude.ai/chat/335f50b1-3dd8-435e-9139-57ec7ca26a3c (at this time
- chats are not shareable :(
- */
- #include "Adafruit_GenericDevice.h"
- /**
- * Basic UART device class that demonstrates using GenericDevice with a Stream
- * interface. This example shows how to wrap a Stream (like HardwareSerial or
- * SoftwareSerial) with read/write callbacks that can be used by BusIO's
- * register functions.
- */
- class UARTDevice {
- public:
- UARTDevice(Stream *serial) : _serial(serial) {}
- // Static callback for writing data to UART
- // Called by GenericDevice when data needs to be sent
- static bool uart_write(void *thiz, const uint8_t *buffer, size_t len) {
- UARTDevice *dev = (UARTDevice *)thiz;
- dev->_serial->write(buffer, len);
- return true;
- }
- // Static callback for reading data from UART
- // Includes timeout and will return false if not enough data available
- static bool uart_read(void *thiz, uint8_t *buffer, size_t len) {
- UARTDevice *dev = (UARTDevice *)thiz;
- uint16_t timeout = 100;
- while (dev->_serial->available() < len && timeout--) {
- delay(1);
- }
- if (timeout == 0) {
- return false;
- }
- for (size_t i = 0; i < len; i++) {
- buffer[i] = dev->_serial->read();
- }
- return true;
- }
- // Create a GenericDevice instance using our callbacks
- Adafruit_GenericDevice *createDevice() {
- return new Adafruit_GenericDevice(this, uart_read, uart_write);
- }
- private:
- Stream *_serial; // Underlying Stream instance (HardwareSerial, etc)
- };
- void setup() {
- Serial.begin(115200);
- while (!Serial)
- ;
- delay(100);
- Serial.println("Generic Device test!");
- // Initialize UART for device communication
- Serial1.begin(115200);
- // Create UART wrapper and BusIO device
- UARTDevice uart(&Serial1);
- Adafruit_GenericDevice *device = uart.createDevice();
- device->begin();
- // Test write/read cycle
- uint8_t write_buf[4] = {0x5, 0x0, 0x0, 0x48};
- uint8_t read_buf[8];
- Serial.println("Writing data...");
- if (!device->write(write_buf, 4)) {
- Serial.println("Write failed!");
- return;
- }
- Serial.println("Reading response...");
- if (!device->read(read_buf, 8)) {
- Serial.println("Read failed!");
- return;
- }
- // Print response bytes
- Serial.print("Got response: ");
- for (int i = 0; i < 8; i++) {
- Serial.print("0x");
- Serial.print(read_buf[i], HEX);
- Serial.print(" ");
- }
- Serial.println();
- }
- void loop() { delay(1000); }
|