From a4e8b9d681929107ee404f11d33c81c20f215857 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 30 Jan 2021 17:00:50 +0100 Subject: [PATCH] Refactor command line arguments --- tasmota/support.ino | 23 ++++++++++++++++++++--- tasmota/xdrv_24_buzzer.ino | 8 +++++--- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index 14f282200..b0b90b981 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -253,7 +253,7 @@ uint32_t ChrCount(const char *str, const char *delim) { } uint32_t ArgC(void) { - return ChrCount(XdrvMailbox.data, ",") +1; + return (XdrvMailbox.data_len > 0) ? ChrCount(XdrvMailbox.data, ",") +1 : 0; } // Function to return a substring defined by a delimiter at an index @@ -280,8 +280,25 @@ char* ArgV(char* dest, int index) { return subStr(dest, XdrvMailbox.data, ",", index); } -uint32_t ParseParameters(uint32_t count, uint32_t *params) -{ +uint32_t ArgVul(uint32_t *args, uint32_t count) { + uint32_t argc = ArgC(); + if (argc > count) { argc = count; } + count = argc; + if (argc) { + char argument[XdrvMailbox.data_len]; + for (uint32_t i = 0; i < argc; i++) { + if (strlen(ArgV(argument, i +1))) { + args[i] = strtoul(argument, nullptr, 0); + } else { + count--; + } + } + } + return count; +} + +uint32_t ParseParameters(uint32_t count, uint32_t *params) { + // Destroys XdrvMailbox.data char *p; uint32_t i = 0; for (char *str = strtok_r(XdrvMailbox.data, ", ", &p); str && i < count; str = strtok_r(nullptr, ", ", &p), i++) { diff --git a/tasmota/xdrv_24_buzzer.ino b/tasmota/xdrv_24_buzzer.ino index 5df477d9f..a2849065e 100644 --- a/tasmota/xdrv_24_buzzer.ino +++ b/tasmota/xdrv_24_buzzer.ino @@ -201,11 +201,13 @@ void CmndBuzzer(void) { if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.payload != 0) { uint32_t parm[4] = { 0 }; - uint32_t mode = 0; ParseParameters(4, parm); - if (XdrvMailbox.payload <= 0) { + uint32_t mode = 0; + if (XdrvMailbox.payload < 0) { parm[0] = 1; // Default Count - mode = -XdrvMailbox.payload; // 0, 1 or 2 + if (XdrvMailbox.payload > -3) { + mode = -XdrvMailbox.payload; // 0, 1 or 2 + } } for (uint32_t i = 1; i < 3; i++) { if (parm[i] < 1) { parm[i] = 1; } // Default On time, Off time