From 215d0d32b41c7f2d7eb9ca7faa1f75a4b0d24b78 Mon Sep 17 00:00:00 2001 From: gengshenghong Date: Wed, 1 Jun 2022 16:18:22 +0800 Subject: [PATCH] allow to set rts/dtr/brk/cts/dsr seperately for windows --- src/serialport.cpp | 36 +++++++++++++++++++++++++++++++----- src/serialport.h | 6 ++++++ src/serialport_win.cpp | 34 ++++++++++++++++++++++------------ 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/src/serialport.cpp b/src/serialport.cpp index c03f38f1..d2d4481f 100644 --- a/src/serialport.cpp +++ b/src/serialport.cpp @@ -32,6 +32,17 @@ double getDoubleFromObject(Napi::Object options, std::string key) { return getValueFromObject(options, key).ToNumber().DoubleValue(); } +bool hasKeyWithDefinedValue(Napi::Object options, std::string key) { + if ((options).Has(key)) { + Napi::Value val = getValueFromObject(options, key); + if (val.IsUndefined() || val.IsNull()) { + return false; + } + return true; + } + return false; +} + Napi::Value Open(const Napi::CallbackInfo& info) { Napi::Env env = info.Env(); // path @@ -184,11 +195,26 @@ Napi::Value Set(const Napi::CallbackInfo& info) { SetBaton* baton = new SetBaton(callback); baton->fd = fd; - baton->brk = getBoolFromObject(options, "brk"); - baton->rts = getBoolFromObject(options, "rts"); - baton->cts = getBoolFromObject(options, "cts"); - baton->dtr = getBoolFromObject(options, "dtr"); - baton->dsr = getBoolFromObject(options, "dsr"); + if (hasKeyWithDefinedValue(options, "brk")) { + baton->brkToSet = true; + baton->brk = getBoolFromObject(options, "brk"); + } + if (hasKeyWithDefinedValue(options, "rts")) { + baton->rtsToSet = true; + baton->rts = getBoolFromObject(options, "rts"); + } + if (hasKeyWithDefinedValue(options, "cts")) { + baton->ctsToSet = true; + baton->cts = getBoolFromObject(options, "cts"); + } + if (hasKeyWithDefinedValue(options, "dtr")) { + baton->dtrToSet = true; + baton->dtr = getBoolFromObject(options, "dtr"); + } + if (hasKeyWithDefinedValue(options, "dsr")) { + baton->rtsToSet = true; + baton->dsr = getBoolFromObject(options, "dsr"); + } baton->lowLatency = getBoolFromObject(options, "lowLatency"); baton->Queue(); diff --git a/src/serialport.h b/src/serialport.h index 6489b417..134385c5 100644 --- a/src/serialport.h +++ b/src/serialport.h @@ -118,6 +118,12 @@ struct SetBaton : public Napi::AsyncWorker { bool brk = false; bool lowLatency = false; + bool rtsToSet = false; + bool dtrToSet = false; + bool brkToSet = false; + bool ctsToSet = false; + bool dsrToSet = false; + void Execute() override; void OnOK() override { diff --git a/src/serialport_win.cpp b/src/serialport_win.cpp index b11c07fc..d314167f 100644 --- a/src/serialport_win.cpp +++ b/src/serialport_win.cpp @@ -223,22 +223,32 @@ void ConnectionOptionsBaton::Execute() { } void SetBaton::Execute() { - if (rts) { - EscapeCommFunction(int2handle(fd), SETRTS); - } else { - EscapeCommFunction(int2handle(fd), CLRRTS); + if (rtsToSet) { + if (rts) { + EscapeCommFunction(int2handle(fd), SETRTS); + } else { + EscapeCommFunction(int2handle(fd), CLRRTS); + } } - if (dtr) { - EscapeCommFunction(int2handle(fd), SETDTR); - } else { - EscapeCommFunction(int2handle(fd), CLRDTR); + if (dtrToSet) { + if (dtr) { + EscapeCommFunction(int2handle(fd), SETDTR); + } else { + EscapeCommFunction(int2handle(fd), CLRDTR); + } } - if (brk) { - EscapeCommFunction(int2handle(fd), SETBREAK); - } else { - EscapeCommFunction(int2handle(fd), CLRBREAK); + if (brkToSet) { + if (brk) { + EscapeCommFunction(int2handle(fd), SETBREAK); + } else { + EscapeCommFunction(int2handle(fd), CLRBREAK); + } + } + + if (!ctsToSet && !dsrToSet) { + return; } DWORD bits = 0;