inverterd: add --delay option

This commit is contained in:
Evgeny Zinoviev 2021-05-22 15:25:18 +03:00
parent e2df212b9f
commit a06039d788
4 changed files with 33 additions and 3 deletions

View File

@ -18,6 +18,7 @@ enum {
LO_RAW, LO_RAW,
LO_TIMEOUT, LO_TIMEOUT,
LO_CACHE_TIMEOUT, LO_CACHE_TIMEOUT,
LO_DELAY,
LO_FORMAT, LO_FORMAT,
LO_DEVICE, LO_DEVICE,
LO_USB_VENDOR_ID, LO_USB_VENDOR_ID,

View File

@ -7,6 +7,7 @@
#include <ios> #include <ios>
#include <getopt.h> #include <getopt.h>
#include "numeric_types.h"
#include "common.h" #include "common.h"
#include "voltronic/device.h" #include "voltronic/device.h"
#include "voltronic/exceptions.h" #include "voltronic/exceptions.h"
@ -29,6 +30,7 @@ static void usage(const char* progname) {
" --device <DEVICE>: 'usb' (default), 'serial' or 'pseudo'\n" " --device <DEVICE>: 'usb' (default), 'serial' or 'pseudo'\n"
" --timeout <TIMEOUT>: Device timeout in ms (default: " << voltronic::Device::TIMEOUT << ")\n" " --timeout <TIMEOUT>: Device timeout in ms (default: " << voltronic::Device::TIMEOUT << ")\n"
" --cache-timeout <TIMEOUT>\n" " --cache-timeout <TIMEOUT>\n"
" --delay <DELAY>: Delay between commands in ms (default: 0)\n"
" Cache validity time, in ms (default: " << server::Server::CACHE_TIMEOUT << ")\n" " Cache validity time, in ms (default: " << server::Server::CACHE_TIMEOUT << ")\n"
" --verbose: Be verbose\n" " --verbose: Be verbose\n"
"\n"; "\n";
@ -53,8 +55,9 @@ static void usage(const char* progname) {
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
// common params // common params
uint64_t timeout = voltronic::Device::TIMEOUT; u64 timeout = voltronic::Device::TIMEOUT;
uint64_t cacheTimeout = server::Server::CACHE_TIMEOUT; u64 cacheTimeout = server::Server::CACHE_TIMEOUT;
u64 delay = 0;
bool verbose = false; bool verbose = false;
// server params // server params
@ -80,6 +83,7 @@ int main(int argc, char *argv[]) {
{"verbose", no_argument, nullptr, LO_VERBOSE}, {"verbose", no_argument, nullptr, LO_VERBOSE},
{"timeout", required_argument, nullptr, LO_TIMEOUT}, {"timeout", required_argument, nullptr, LO_TIMEOUT},
{"cache-timeout", required_argument, nullptr, LO_CACHE_TIMEOUT}, {"cache-timeout", required_argument, nullptr, LO_CACHE_TIMEOUT},
{"delay", required_argument, nullptr, LO_DELAY},
{"device", required_argument, nullptr, LO_DEVICE}, {"device", required_argument, nullptr, LO_DEVICE},
{"usb-vendor-id", required_argument, nullptr, LO_USB_VENDOR_ID}, {"usb-vendor-id", required_argument, nullptr, LO_USB_VENDOR_ID},
{"usb-device-id", required_argument, nullptr, LO_USB_DEVICE_ID}, {"usb-device-id", required_argument, nullptr, LO_USB_DEVICE_ID},
@ -139,6 +143,10 @@ int main(int argc, char *argv[]) {
cacheTimeout = std::stoull(arg); cacheTimeout = std::stoull(arg);
break; break;
case LO_DELAY:
delay = std::stoull(arg);
break;
case LO_USB_VENDOR_ID: case LO_USB_VENDOR_ID:
try { try {
if (arg.size() != 4) if (arg.size() != 4)
@ -266,6 +274,7 @@ int main(int argc, char *argv[]) {
server::Server server(dev); server::Server server(dev);
server.setVerbose(verbose); server.setVerbose(verbose);
server.setDelay(delay);
server.setCacheTimeout(cacheTimeout); server.setCacheTimeout(cacheTimeout);
server.start(host, port); server.start(host, port);

View File

@ -25,6 +25,8 @@ Server::Server(std::shared_ptr<voltronic::Device> device)
: sock_(0) : sock_(0)
, port_(0) , port_(0)
, cacheTimeout_(CACHE_TIMEOUT) , cacheTimeout_(CACHE_TIMEOUT)
, delay_(0)
, endExecutionTime_(0)
, verbose_(false) , verbose_(false)
, device_(std::move(device)) { , device_(std::move(device)) {
client_.setDevice(device_); client_.setDevice(device_);
@ -39,6 +41,10 @@ void Server::setCacheTimeout(u64 timeout) {
cacheTimeout_ = timeout; cacheTimeout_ = timeout;
} }
void Server::setDelay(u64 delay) {
delay_ = delay;
}
Server::~Server() { Server::~Server() {
if (sock_ > 0) if (sock_ > 0)
close(sock_); close(sock_);
@ -121,14 +127,25 @@ std::shared_ptr<p18::response_type::BaseResponse> Server::executeCommand(p18::Co
cache_.erase(it); cache_.erase(it);
} }
if (delay_ != 0 && endExecutionTime_ != 0) {
u64 now = voltronic::timestamp();
u64 diff = now - endExecutionTime_;
if (diff < delay_)
usleep(delay_ - diff);
}
try { try {
auto response = client_.execute(commandType, arguments); auto response = client_.execute(commandType, arguments);
endExecutionTime_ = voltronic::timestamp();
CachedResponse cr { CachedResponse cr {
.time = voltronic::timestamp(), .time = endExecutionTime_,
.arguments = arguments, .arguments = arguments,
.response = response .response = response
}; };
cache_[commandType] = cr; cache_[commandType] = cr;
return response; return response;
} }
catch (voltronic::DeviceError& e) { catch (voltronic::DeviceError& e) {

View File

@ -42,6 +42,8 @@ private:
std::shared_ptr<voltronic::Device> device_; std::shared_ptr<voltronic::Device> device_;
u64 cacheTimeout_; u64 cacheTimeout_;
u64 delay_;
u64 endExecutionTime_;
std::map<p18::CommandType, CachedResponse> cache_; std::map<p18::CommandType, CachedResponse> cache_;
std::mutex threads_mutex_; std::mutex threads_mutex_;
@ -59,6 +61,7 @@ public:
void setVerbose(bool verbose); void setVerbose(bool verbose);
void setCacheTimeout(u64 timeout); void setCacheTimeout(u64 timeout);
void setDelay(u64 delay);
void start(std::string& host, int port); void start(std::string& host, int port);
bool verbose() const { return verbose_; } bool verbose() const { return verbose_; }