From 03bf5eb50d18041ae2ed611e7f27b8fa24530368 Mon Sep 17 00:00:00 2001 From: Adam Honse Date: Mon, 1 Mar 2021 13:42:45 -0600 Subject: [PATCH] Add message queue to speed up FanBus updates --- .../FanBusController/FanBusController.cpp | 10 ++++---- .../FanBusController/FanBusInterface.cpp | 24 +++++++++++++++++++ .../FanBusController/FanBusInterface.h | 11 +++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/Controllers/FanBusController/FanBusController.cpp b/Controllers/FanBusController/FanBusController.cpp index 59e839045..46704fdcb 100644 --- a/Controllers/FanBusController/FanBusController.cpp +++ b/Controllers/FanBusController/FanBusController.cpp @@ -37,10 +37,12 @@ void FanBusController::SetLEDs(std::vector colors) unsigned char grn = RGBGetGValue(colors[led_idx]); unsigned char blu = RGBGetBValue(colors[led_idx]); - bus->write(dev, 0x10 + (led_idx * 3), red); - bus->write(dev, 0x11 + (led_idx * 3), grn); - bus->write(dev, 0x12 + (led_idx * 3), blu); + bus->write_queue(dev, 0x10 + (led_idx * 3), red); + bus->write_queue(dev, 0x11 + (led_idx * 3), grn); + bus->write_queue(dev, 0x12 + (led_idx * 3), blu); } - bus->write(dev, 0x0C, 0x01); + bus->write_queue(dev, 0x0C, 0x01); + + bus->process_queue(); } diff --git a/Controllers/FanBusController/FanBusInterface.cpp b/Controllers/FanBusController/FanBusInterface.cpp index 1a33404fa..ed5551cdf 100644 --- a/Controllers/FanBusController/FanBusInterface.cpp +++ b/Controllers/FanBusController/FanBusInterface.cpp @@ -104,6 +104,30 @@ int FanBusInterface::write return(serialport->serial_write((char *)fanbus_msg, 5)); } +void FanBusInterface::write_queue + ( + unsigned char dev_addr, + unsigned char int_addr, + unsigned char val + ) +{ + unsigned char fanbus_msg[] = { 0x00, int_addr, dev_addr, val, 0xFF }; + + for(int i = 0; i < sizeof(fanbus_msg); i++) + { + fanbus_msg_queued.push_back(fanbus_msg[i]); + } +} + +int FanBusInterface::process_queue() +{ + int return_val = serialport->serial_write((char *)&fanbus_msg_queued[0], fanbus_msg_queued.size()); + + fanbus_msg_queued.clear(); + + return(return_val); +} + std::vector FanBusInterface::DetectControllers() { std::vector detected_controllers; diff --git a/Controllers/FanBusController/FanBusInterface.h b/Controllers/FanBusController/FanBusInterface.h index b4b1d2b96..e9bc3b905 100644 --- a/Controllers/FanBusController/FanBusInterface.h +++ b/Controllers/FanBusController/FanBusInterface.h @@ -32,8 +32,19 @@ public: unsigned char val ); + void write_queue + ( + unsigned char dev_addr, + unsigned char int_addr, + unsigned char val + ); + + int process_queue(); + private: serial_port * serialport; std::string port_name; bool half_duplex; + + std::vector fanbus_msg_queued; };