From 75e9319c32d79bd7ace0200da9a20e6f532ebe2d Mon Sep 17 00:00:00 2001 From: Yasser Yassine Date: Fri, 12 Jan 2024 20:34:11 +0000 Subject: [PATCH] A2B: Add example for reading/writing A2B board I2C registers --- examples/cpp/a2b/src/a2b.cpp | 90 +++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 2 deletions(-) diff --git a/examples/cpp/a2b/src/a2b.cpp b/examples/cpp/a2b/src/a2b.cpp index f022777..082fbd6 100644 --- a/examples/cpp/a2b/src/a2b.cpp +++ b/examples/cpp/a2b/src/a2b.cpp @@ -233,11 +233,93 @@ void example5(std::shared_ptr& rada2b) { std::thread listenerThread{listener}; // Transmit wave file using example0 - example0(rada2b); listenerThread.join(); } +// Example 6: Retrieving A2B bus status using I2C messaages. +void example6(std::shared_ptr& rada2b) { + std::shared_ptr msg = std::make_shared(); + std::shared_ptr msgFilter = std::make_shared(icsneo::Network::NetID::I2C2); + + msg->network = icsneo::Network(icsneo::Network::NetID::I2C2); + msg->controlBytes.resize(1); + msg->controlBytes[0] = static_cast(0x17u); // Register address for A2B INTTYPE + msg->dataBytes.resize(1, 0); + msg->direction = icsneo::I2CMessage::Direction::Read; + msg->deviceMode = icsneo::I2CMessage::DeviceMode::Controller; + msg->address = static_cast(0x68); // A2B master node address. + msg->isTXMsg = true; + + auto handler = rada2b->addMessageCallback(std::make_shared( + [] (std::shared_ptr newMsg) { + + if(newMsg->type == icsneo::Message::Type::Frame) { + const auto& frame = std::dynamic_pointer_cast(newMsg); + if(frame && frame->network.getNetID() == icsneo::Network::NetID::I2C2) { + const auto& i2cMessage = std::dynamic_pointer_cast(frame); + + if(!i2cMessage) { + return; + } + + if(i2cMessage->controlBytes.size() == 1 && i2cMessage->direction == icsneo::I2CMessage::Direction::Read) { + if(i2cMessage->controlBytes[0] == 0x17u) { + if(i2cMessage->dataBytes.size() == 1) { + std::cout << "Current A2B bus status INTTYPE code: " << static_cast(i2cMessage->dataBytes[0]) << '\n'; + } + } else if(i2cMessage->controlBytes[0] == 0x03u) { + if(i2cMessage->dataBytes.size() == 1) { + std::cout << "A2B_PRODUCT register: " << static_cast(i2cMessage->dataBytes[0]) << std::endl; + } + } else if(i2cMessage->controlBytes[0] == 0x02u) { + if(i2cMessage->dataBytes.size() == 1) { + std::cout << "A2B_VENDOR register: " << static_cast(i2cMessage->dataBytes[0]) << std::endl; + } + } else if(i2cMessage->controlBytes[0] == 0x1C) { + if(i2cMessage->dataBytes.size() == 1) { + std::cout << "A2B_INTMSK1 register value: " << static_cast(i2cMessage->dataBytes[0]) << std::endl; + } + } + } + } + } + } + , msgFilter)); + if(!rada2b->transmit(msg)) { + std::cout << "Failed to transmit." << std::endl; + } + msg->controlBytes[0] = 0x03; // Address for A2B_PRODUCT register + + if(!rada2b->transmit(msg)) { + std::cout << "Failed to transmit." << std::endl; + } + + msg->controlBytes[0] = 0x02; // Address for A2B_VENDOR register + if(!rada2b->transmit(msg)) { + std::cout << "Failed to transmit." << std::endl; + } + + msg->controlBytes[0] = 0x1C ; // Address for A2B_INTMSK1 register + msg->dataBytes[0] = 0x11; + msg->direction = icsneo::I2CMessage::Direction::Write; + // Write register + if(!rada2b->transmit(msg)) { + std::cout << "Failed to transmit" << std::endl; + } + std::this_thread::sleep_for(std::chrono::milliseconds(2000)); + msg->direction = icsneo::I2CMessage::Direction::Read; + + // Read register + if(!rada2b->transmit(msg)) { + std::cout << "Failed to transmit." << std::endl; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(2000)); + + rada2b->removeMessageCallback(handler); +} + void displayUsage() { std::cout << "libicsneo A2B example" << std::endl; std::cout << "Example must be ran with rada2b as slave on TDM4 32 bit channel size and one ADI master node" << std::endl; @@ -254,6 +336,7 @@ void displayUsage() { std::cout << "3\tA2BMessage API" << std::endl; std::cout << "4\tPackaging and transmitting sine wave using A2BMessage API" << std::endl; std::cout << "5\tWave loopback" << std::endl; + std::cout << "6\tRead/write I2C registers on A2B board" << std::endl; } int main(int argc, char** argv) { @@ -277,7 +360,7 @@ int main(int argc, char** argv) { int option = atoi(arguments[2].c_str()); - if(option < 0 || option > 5) { + if(option < 0 || option > 6) { std::cerr << "Invalid usage." << std::endl; displayUsage(); return EXIT_FAILURE; @@ -345,6 +428,9 @@ int main(int argc, char** argv) { case 5: example5(rada2b); break; + case 6: + example6(rada2b); + break; default: break; }